不知道為甚麼 當我用while( ) 無限輸入時 不能寫 while(1) 再在迴圈輸入 否則會得TLE(超時),
但如果 在while( )輸入的話 就不太會出現TLE 反而是AC
#include <stdio.h>
int j_1 ( int math[][ 10 ] ) // 檢查行列
{
int i , j ;
for ( i = 1 ; i <= 9 ; i ++ ){ // 每行都有 1~9個數字 不重複
int num[ 9 ] = {} ;
for ( j = 1 ; j <= 9 ; j ++ ){
num [ math[ i ][ j ] - 1 ] += 1 ;
if ( num [ math[ i ][ j ] - 1 ] != 1 )
return 0 ;
}
}
for ( j = 1 ; j <= 9 ; j ++ ){ // 每列都有 1~9 不重複
int num[ 9 ] = {} ;
for ( i = 1 ; i <= 9 ; i ++ ){
num [ math[ i ][ j ] - 1 ] += 1 ;
if ( num [ math[ i ][ j ] - 1 ] > 1 )
return 0 ;
}
}
return 1 ;
}
int j_2 ( int math[][ 10 ] ) //檢查9個小九宮格
{
int i , j ;
int n1 = 0 , n2 = 0 , t1 = 0 ; // n1 用來換行 n2 用來換列 t1用來紀錄到了第幾個九宮格
while( t1 <= 9 ){
int num[ 9 ] = {} ;
for( i = 1 + n1 ; i <= 3 + n1 ; i++ ){ // 一個小九宮格的檢查 有1~9 不重複
for ( j = 1 + n2 ; j <= 3 + n2 ; j++ ){
num[ math[ i ][ j ] - 1 ] += 1 ;
if( num[ math[ i ][ j ] - 1 ] > 1 )
return 0 ;
}
}
if ( n2 < 4 ) // 換到右邊的九宮格進行檢查
n2 += 3 ;
t1 += 1 ;
if ( t1 % 3 == 1 && n2 == 6 ){ //此行的小九宮格檢查完 後 換行
n2 = 0 ;
if ( n1 < 4 )
n1 += 3 ;
}
}
return 1 ;
}
int main()
{
int math[ 10 ][ 10 ] = {} ;
int i , j ;
while( scanf ( "%d %d %d %d %d %d %d %d %d" , &math[ 1 ][ 1 ] , &math[ 1 ][ 2 ]
, &math[ 1 ][ 3 ] , &math[ 1 ][ 4 ] , &math[ 1 ][ 5 ] , &math[ 1 ][ 6 ]
, &math[ 1 ][ 7 ] , &math[ 1 ][ 8 ] , &math[ 1 ][ 9 ] ) != EOF )
{
for ( i = 2 ; i <= 9 ; i++ )
for ( j = 1 ; j <= 9 ; j++ )
scanf( "%d" , &math[ i ][ j ] ) ;
if ( j_1( math ) == 1 && j_2( math ) == 1 ) // 兩項檢查都通過
printf( "yes\n" ) ;
else
printf( "no\n" ) ;
}
return 0 ;
}
執行結果 : AC 0ms 80kb
恩..在寫解題報告時它有標明別將整個code貼出,否則會被覆蓋...不知道有沒有真的被覆蓋..在讀此的人可否回應一下有無遮避掉嗎??
我會貼出整個程式碼是因為我常從別人的程式學到如何思考,希望大家不要copy
恩..在寫解題報告時它有標明別將整個code貼出,否則會被覆蓋...不知道有沒有真的被覆蓋..在讀此的人可否回應一下有無遮避掉嗎??
我會貼出整個程式碼是因為我常從別人的程式學到如何思考,希望大家不要copy
沒有被遮蔽,單純只貼程式碼,或許會被管理員刪除。
程式內有 while(1) 就等價於是 while(true)
這件事其實對程式來說是很不好的
因為它就代表這個迴圈(程式)永遠不會結束
(除非裡面有break)
那一個永遠不會結束的程式
在線上批改系統一定就是判你超時
有的嚴格的系統就算你裡面有break
還是會判你的語法不合法