#14099: 我是用C寫的,題目需一些巧思,可供參考


HuangNO1 (雷姆醬)

學校 : 中南大学
編號 : 60967
來源 : [103.156.242.195]
最後登入時間 :
2023-12-03 15:57:20
a016. 數獨(SUDOKU) | From: [36.227.161.239] | 發表日期 : 2018-06-13 00:25

不知道為甚麼 當我用while( ) 無限輸入時 不能寫 while(1) 再在迴圈輸入 否則會得TLE(超時),

但如果 在while( )輸入的話 就不太會出現TLE 反而是AC  undecided

#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

 
#14103: Re:我是用C寫的,題目需一些巧思,可供參考


HuangNO1 (雷姆醬)

學校 : 中南大学
編號 : 60967
來源 : [103.156.242.195]
最後登入時間 :
2023-12-03 15:57:20
a016. 數獨(SUDOKU) | From: [61.230.165.75] | 發表日期 : 2018-06-13 22:18

恩..在寫解題報告時它有標明別將整個code貼出,否則會被覆蓋...不知道有沒有真的被覆蓋..在讀此的人可否回應一下有無遮避掉嗎??

我會貼出整個程式碼是因為我常從別人的程式學到如何思考,希望大家不要copy

 
#14110: Re:我是用C寫的,題目需一些巧思,可供參考


a0970580085@gmail.com (/)

學校 : 義守大學
編號 : 74647
來源 : [125.229.235.114]
最後登入時間 :
2023-08-30 17:36:04
a016. 數獨(SUDOKU) | From: [111.254.219.81] | 發表日期 : 2018-06-14 10:43

恩..在寫解題報告時它有標明別將整個code貼出,否則會被覆蓋...不知道有沒有真的被覆蓋..在讀此的人可否回應一下有無遮避掉嗎??

我會貼出整個程式碼是因為我常從別人的程式學到如何思考,希望大家不要copy



沒有被遮蔽,單純只貼程式碼,或許會被管理員刪除。

 
#15646: Re:我是用C寫的,題目需一些巧思,可供參考


HUNGGUO (HUNGGUO)

學校 : 國立臺灣大學
編號 : 86881
來源 : [223.137.49.23]
最後登入時間 :
2018-10-19 10:26:26
a016. 數獨(SUDOKU) | From: [114.46.32.87] | 發表日期 : 2018-10-18 14:58

程式內有 while(1) 就等價於是 while(true)

這件事其實對程式來說是很不好的

因為它就代表這個迴圈(程式)永遠不會結束

(除非裡面有break)

那一個永遠不會結束的程式

在線上批改系統一定就是判你超時

有的嚴格的系統就算你裡面有break

還是會判你的語法不合法

 
ZeroJudge Forum