Post by huangno1 on Feb 26, 2017 20:56:20 GMT -8
程式說明
科比退休了,他在退休後回家種田。他買了一塊正方形的農田來種植農作物。在播種時,為了增添樂趣,他用一種很特殊的方式來決定每個單位要撒幾顆種子。
首先,由左上到右下的對角線上,每一個單位會撒介於 1 到 10 的隨機數量。接著,當一個單位的四個鄰近(上、下、左、右)單位有兩個單位已經播種了,則該單位的種子數量會取決於鄰近兩單位中「較幸運」的種子數。給定兩個整數 a 和 b,所謂「較幸運」的定義為:
(1) 若 a為奇數,b 為偶數,則稱 a 較幸運;
(2) 若兩者均為奇數,則稱數值較大的較幸運;
(3) 若兩者均為偶數,則稱數值較小的較幸運。
本題需撰寫兩個函式 random() 和 lucky()。
(1) random() 函式有兩個整數參數 lb 和 ub,保證呼叫端傳入的 lb 值不會比 ub 值大(可能相等)。本函式將以相同機率回傳 [lb, ub] 區間中的任一整數值。例如 random(3, 3) 必定回傳 3;random(10, 11) 以相等機率回傳 10或 11。
(2) lucky() 函式有兩個整數參數 a 和 b,本函式將回傳兩個數中「較幸運」的那個數值。例如 lucky(1, 2) 回傳 1;lucky(1, 3) 回傳 3;lucky(2, 4) 回傳 2。
科比將會先輸入他的農田邊長(最大邊長為 7),請你輸出農田每一個單位的種子數目。輸出格式請使用 printf("%3d")。
【輸出範例 (若邊長為 4)】
2 2 5 5
2 8 5 5
5 5 5 5
5 5 5 1
#include <stdio.h>
#include <stdlib.h>
int random(int lb, int ub)
{
return lb+rand()%(ub-lb+1);
}
// -------------------------------------------------------------------
int lucky ( int a , int b )
{
if ( a % 2 )
{
if ( ! ( b % 2 ) ) return a ;
else return a > b ? a : b ;
}
else
{
if ( ! ( b % 2 ) ) return a < b ? a : b ;
else return b ;
}
}
// -------------------------------------------------------------------
int main()
{
int r=0; scanf("%d", &r); srand(r); // 本行是為了系統自動批改而加的。
constexpr size_t MaxSideLength=7;
int board[MaxSideLength][MaxSideLength]= {};
int n=0;
scanf("%d", &n);
for (int i=0; i<n; i+=1)
{
board=random(1, 10);
}
int i , x , y ;
for ( i = 1 ; i < n ; i ++ )
{
for ( x = 0 ; x < n ; x += 1 )
{
for ( y = 0 ; y < n ; y ++ )
{
if ( board [ x ] [ y ] == 0 )
{
if ( board [ x ] [ y - 1 ] > 0 && board [ x + 1 ] [ y ] > 0 )
board [ x ] [ y ] = lucky ( board [ x ] [ y - 1 ] , board [ x + 1 ] [ y ] ) ;
else if ( board [ x - 1 ] [ y ] > 0 && board [ x ] [ y + 1 ] > 0 )
board [ x ] [ y ] = lucky ( board [ x - 1 ] [ y ] , board [ x ] [ y + 1 ] ) ;
}
}
}
}
for (int r=0; r<n; r+=1)
{
for (int c=0; c<n; c+=1)
{
printf("%3d", board[r][c]);
}
printf("\n");
}
}
科比退休了,他在退休後回家種田。他買了一塊正方形的農田來種植農作物。在播種時,為了增添樂趣,他用一種很特殊的方式來決定每個單位要撒幾顆種子。
首先,由左上到右下的對角線上,每一個單位會撒介於 1 到 10 的隨機數量。接著,當一個單位的四個鄰近(上、下、左、右)單位有兩個單位已經播種了,則該單位的種子數量會取決於鄰近兩單位中「較幸運」的種子數。給定兩個整數 a 和 b,所謂「較幸運」的定義為:
(1) 若 a為奇數,b 為偶數,則稱 a 較幸運;
(2) 若兩者均為奇數,則稱數值較大的較幸運;
(3) 若兩者均為偶數,則稱數值較小的較幸運。
本題需撰寫兩個函式 random() 和 lucky()。
(1) random() 函式有兩個整數參數 lb 和 ub,保證呼叫端傳入的 lb 值不會比 ub 值大(可能相等)。本函式將以相同機率回傳 [lb, ub] 區間中的任一整數值。例如 random(3, 3) 必定回傳 3;random(10, 11) 以相等機率回傳 10或 11。
(2) lucky() 函式有兩個整數參數 a 和 b,本函式將回傳兩個數中「較幸運」的那個數值。例如 lucky(1, 2) 回傳 1;lucky(1, 3) 回傳 3;lucky(2, 4) 回傳 2。
科比將會先輸入他的農田邊長(最大邊長為 7),請你輸出農田每一個單位的種子數目。輸出格式請使用 printf("%3d")。
【輸出範例 (若邊長為 4)】
2 2 5 5
2 8 5 5
5 5 5 5
5 5 5 1
#include <stdio.h>
#include <stdlib.h>
int random(int lb, int ub)
{
return lb+rand()%(ub-lb+1);
}
// -------------------------------------------------------------------
int lucky ( int a , int b )
{
if ( a % 2 )
{
if ( ! ( b % 2 ) ) return a ;
else return a > b ? a : b ;
}
else
{
if ( ! ( b % 2 ) ) return a < b ? a : b ;
else return b ;
}
}
// -------------------------------------------------------------------
int main()
{
int r=0; scanf("%d", &r); srand(r); // 本行是為了系統自動批改而加的。
constexpr size_t MaxSideLength=7;
int board[MaxSideLength][MaxSideLength]= {};
int n=0;
scanf("%d", &n);
for (int i=0; i<n; i+=1)
{
board=random(1, 10);
}
int i , x , y ;
for ( i = 1 ; i < n ; i ++ )
{
for ( x = 0 ; x < n ; x += 1 )
{
for ( y = 0 ; y < n ; y ++ )
{
if ( board [ x ] [ y ] == 0 )
{
if ( board [ x ] [ y - 1 ] > 0 && board [ x + 1 ] [ y ] > 0 )
board [ x ] [ y ] = lucky ( board [ x ] [ y - 1 ] , board [ x + 1 ] [ y ] ) ;
else if ( board [ x - 1 ] [ y ] > 0 && board [ x ] [ y + 1 ] > 0 )
board [ x ] [ y ] = lucky ( board [ x - 1 ] [ y ] , board [ x ] [ y + 1 ] ) ;
}
}
}
}
for (int r=0; r<n; r+=1)
{
for (int c=0; c<n; c+=1)
{
printf("%3d", board[r][c]);
}
printf("\n");
}
}