Post by huangno1 on Mar 1, 2017 21:11:40 GMT -8
程式說明
阿強最近在練習預官考試的智力測驗,裡面有一類型的題目是問兩個圖形能否經由旋轉後變成一樣的圖形。例如底下三個圖形經過旋轉後都是一樣的圖形。現在你要撰寫一個功能,判斷兩個圖形是否為相同的圖形。每個圖形是由 3 x 3 的整數矩陣表示。
【圖 a】
1 2 3
4 5 6
7 8 9
【圖 b】
3 6 9
2 5 8
1 4 7
【圖 c】
9 8 7
6 5 4
3 2 1
請撰寫兩個支援函式:
1. Rotate() 函式:傳入兩個 3 x 3 整數陣列 dest 和 src,代表兩個圖形。本函式會將 src 逆時針旋轉90度後的結果存入 dest。例如上圖 (a) 旋轉後變成圖 (b)。
2. isEqual() 函式:傳入兩個 3 x 3 整數陣列 lhs 和 rhs,代表兩個圖形,回傳一個布林 (bool) 值。如果兩個陣列相同,回傳 true,否則回傳 false。此處所稱「相同」,指的是沒有旋轉的情況下,兩個陣列中每個元素的值相同。
若兩者為相同圖形,請輸出第一個圖形需經幾次旋轉始得第二個圖形。若兩者不相同,請輸出 They are not equal.。
【輸入範例1】
1 2 3
4 5 6
7 8 9
3 6 9
2 5 8
1 4 7
【輸出範例1】
They are equal after 1 rotation.
【輸入範例2】
3 6 9
2 5 8
1 4 7
1 2 3
4 5 6
7 8 9
【輸出範例2】
They are equal after 3 rotations.
#include <stdio.h>
constexpr int MatrixSize = 3;
bool isEqual(
int f [ ][ MatrixSize ] , int ans [ ][ MatrixSize ]
)
{
int i , j ;
for ( i = 0 ; i < MatrixSize ; i ++ )
{
for ( j = 0 ; j < MatrixSize ; j ++ )
{
if ( f [ i ] [ j ] != ans [ i ] [ j ] )
{
return 0 ;
break ;
}
}
}
return 1 ;
}
// ----------------------------------------------
void Rotate(
int f [ ][ MatrixSize ]
)
{
int x [ MatrixSize ] [ MatrixSize ] = {};
int i , j , x1 , y1 ;
for ( j = 0 , x1 = 0 ; j < MatrixSize , x1 < MatrixSize ; j++ , x1 ++)
{
for ( i = MatrixSize - 1 , y1 = 0 ; i >= 0 , y1 < MatrixSize ; i -- , y1++ )
x [ x1 ][ y1 ] = f [ i ] [ j ] ;
}
for ( i = 0 ; i < MatrixSize ; i ++ )
{
for ( j = 0 ; j < MatrixSize ; j ++ )
f [ i ] [ j ] = x [ i ] [ j ] ;
}
}
// ----------------------------------------------
int main()
{
int f [ MatrixSize ] [ MatrixSize ] = { } , ans [ MatrixSize ] [ MatrixSize ] = { } ;
int i , j ;
int sum = 0 ;
for ( i = 0 ; i < MatrixSize ; i ++ )
{
for ( j = 0 ; j < MatrixSize ; j ++ )
scanf ( " %d" , &ans [ i ] [ j ] ) ;
}
for ( i = 0 ; i < MatrixSize ; i ++ )
{
for ( j = 0 ; j < MatrixSize ; j ++ )
scanf ( " %d" , &f [ i ] [ j ] ) ;
}
for ( i = 0 ; i < 4 ; i++ )
{
if ( isEqual ( f , ans ) ){
break ;
}
else {
Rotate ( f ) ;
sum ++ ;
}
}
if ( !( isEqual ( f , ans ) ) )
printf ( "They are not equal." ) ;
else
{
if ( sum == 1 || sum == 0 )
printf ( "They are equal after %d rotation." , sum ) ;
else
printf ( "They are equal after %d rotations." , sum ) ;
}
return 0;
}
阿強最近在練習預官考試的智力測驗,裡面有一類型的題目是問兩個圖形能否經由旋轉後變成一樣的圖形。例如底下三個圖形經過旋轉後都是一樣的圖形。現在你要撰寫一個功能,判斷兩個圖形是否為相同的圖形。每個圖形是由 3 x 3 的整數矩陣表示。
【圖 a】
1 2 3
4 5 6
7 8 9
【圖 b】
3 6 9
2 5 8
1 4 7
【圖 c】
9 8 7
6 5 4
3 2 1
請撰寫兩個支援函式:
1. Rotate() 函式:傳入兩個 3 x 3 整數陣列 dest 和 src,代表兩個圖形。本函式會將 src 逆時針旋轉90度後的結果存入 dest。例如上圖 (a) 旋轉後變成圖 (b)。
2. isEqual() 函式:傳入兩個 3 x 3 整數陣列 lhs 和 rhs,代表兩個圖形,回傳一個布林 (bool) 值。如果兩個陣列相同,回傳 true,否則回傳 false。此處所稱「相同」,指的是沒有旋轉的情況下,兩個陣列中每個元素的值相同。
若兩者為相同圖形,請輸出第一個圖形需經幾次旋轉始得第二個圖形。若兩者不相同,請輸出 They are not equal.。
【輸入範例1】
1 2 3
4 5 6
7 8 9
3 6 9
2 5 8
1 4 7
【輸出範例1】
They are equal after 1 rotation.
【輸入範例2】
3 6 9
2 5 8
1 4 7
1 2 3
4 5 6
7 8 9
【輸出範例2】
They are equal after 3 rotations.
#include <stdio.h>
constexpr int MatrixSize = 3;
bool isEqual(
int f [ ][ MatrixSize ] , int ans [ ][ MatrixSize ]
)
{
int i , j ;
for ( i = 0 ; i < MatrixSize ; i ++ )
{
for ( j = 0 ; j < MatrixSize ; j ++ )
{
if ( f [ i ] [ j ] != ans [ i ] [ j ] )
{
return 0 ;
break ;
}
}
}
return 1 ;
}
// ----------------------------------------------
void Rotate(
int f [ ][ MatrixSize ]
)
{
int x [ MatrixSize ] [ MatrixSize ] = {};
int i , j , x1 , y1 ;
for ( j = 0 , x1 = 0 ; j < MatrixSize , x1 < MatrixSize ; j++ , x1 ++)
{
for ( i = MatrixSize - 1 , y1 = 0 ; i >= 0 , y1 < MatrixSize ; i -- , y1++ )
x [ x1 ][ y1 ] = f [ i ] [ j ] ;
}
for ( i = 0 ; i < MatrixSize ; i ++ )
{
for ( j = 0 ; j < MatrixSize ; j ++ )
f [ i ] [ j ] = x [ i ] [ j ] ;
}
}
// ----------------------------------------------
int main()
{
int f [ MatrixSize ] [ MatrixSize ] = { } , ans [ MatrixSize ] [ MatrixSize ] = { } ;
int i , j ;
int sum = 0 ;
for ( i = 0 ; i < MatrixSize ; i ++ )
{
for ( j = 0 ; j < MatrixSize ; j ++ )
scanf ( " %d" , &ans [ i ] [ j ] ) ;
}
for ( i = 0 ; i < MatrixSize ; i ++ )
{
for ( j = 0 ; j < MatrixSize ; j ++ )
scanf ( " %d" , &f [ i ] [ j ] ) ;
}
for ( i = 0 ; i < 4 ; i++ )
{
if ( isEqual ( f , ans ) ){
break ;
}
else {
Rotate ( f ) ;
sum ++ ;
}
}
if ( !( isEqual ( f , ans ) ) )
printf ( "They are not equal." ) ;
else
{
if ( sum == 1 || sum == 0 )
printf ( "They are equal after %d rotation." , sum ) ;
else
printf ( "They are equal after %d rotations." , sum ) ;
}
return 0;
}