#11529: 請問一下...(C語言)


410523007 (Shippo)


完成後跑範例或是維基百科所附的數獨都是對的,卻還是WA,麻煩強者幫忙解題

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int num[81],s,i,j,k=0,t=0,z=0,x=0,u,n,f;
        
    for(;scanf("%d",&num[0])!=EOF;){
        
        for (i=1;i<81;i++){
            
        scanf("%d",&num[i]);
        
        }

    for (j=0;j < 9;j++){

        for (i=0;i < 9;i++)
        {

        s=i+(9*j);

        x += num[s];
        
        }



            if (x != 45)
        {
            x=0;
            k=1;
        }
            else if (x == 45)
        {
            k=0;
            x=0;
        }

    }

    for (j=0;j < 9;j++){

        for (i=0;i<9;i++)
        {
            s=(9*(i)+j);
            x += num[s];
        }
        

        
            if (x != 45)
        {
            t=1;
            x=0;
        }
    else if (x == 45)
        {
            t=0;
            x=0;
        }
}
    for (j=0;j < 9;j++){

            for (i=0;i < 3;i++){

                for (u=0;u < 3;u++){

                    s=(u+(9*i))+3*j;
                    
                    if (j >=0 && j <=2)
                    f=s;
                    else if (j >= 3 && j<=5)
                    f=s+18;
                    else if (j>=6 && j<=8)
                    f=s+36;
                    
                    x += num[f];
                }

    }


    
    if (x != 45)
    {
        z=1,x=0;

    }     
    else
        
        {
            z=0;
            x=0;
        }

    }

    if (t == 0 && k==0 && z==0)

        printf("yes\n");

    else

        printf("no\n");
        
    }

return 0;

}

#11530: Re:請問一下...(C語言)


jack60126 (hadman)


完成後跑範例或是維基百科所附的數獨都是對的,卻還是WA,麻煩強者幫忙解題

 

#include
#include
#include

int main()
{
    int num[81],s,i,j,k=0,t=0,z=0,x=0,u,n,f;
        
    for(;scanf("%d",&num[0])!=EOF;){
        
        for (i=1;i<81;i++){
            
        scanf("%d",&num[i]);
        
        }

    for (j=0;j < 9;j++){

        for (i=0;i < 9;i++)
        {

        s=i+(9*j);

        x += num[s];
        
        }



            if (x != 45)
        {
            x=0;
            k=1;
        }
            else if (x == 45)
        {
            k=0;
            x=0;
        }

    }

    for (j=0;j < 9;j++){

        for (i=0;i<9;i++)
        {
            s=(9*(i)+j);
            x += num[s];
        }
        

        
            if (x != 45)
        {
            t=1;
            x=0;
        }
    else if (x == 45)
        {
            t=0;
            x=0;
        }
}
    for (j=0;j < 9;j++){

            for (i=0;i < 3;i++){

                for (u=0;u < 3;u++){

                    s=(u+(9*i))+3*j;
                    
                    if (j >=0 && j <=2)
                    f=s;
                    else if (j >= 3 && j<=5)
                    f=s+18;
                    else if (j>=6 && j<=8)
                    f=s+36;
                    
                    x += num[f];
                }

    }


    
    if (x != 45)
    {
        z=1,x=0;

    }     
    else
        
        {
            z=0;
            x=0;
        }

    }

    if (t == 0 && k==0 && z==0)

        printf("yes\n");

    else

        printf("no\n");
        
    }

return 0;

}


時間複雜度太高了 想辦法簡化code    O(n^3) 這麼高的時間複雜度基本上速度太慢 跑太多資料就慘了~

#11531: Re:請問一下...(C語言)


jack60126 (hadman)


#include <stdio.h>

#include <stdlib.h>

#include <math.h>

 

int main()

{

    int num[81],s,i,j,k=0,t=0,z=0,x=0,u,n,f;

        

    for(;scanf("%d",&num[0])!=EOF;){

        

        for (i=1;i<81;i++){

            

        scanf("%d",&num[i]);

        

        }

 

    for (j=0;j < 9;j++){

 

        for (i=0;i < 9;i++)

        {

 

        s=i+(9*j);

 

        x += num[s];

        

        }

 

 

 

            if (x != 45)

        {

            x=0;

            k=1;

            goto end;

        }

            else if (x == 45)

        {

            k=0;

            x=0;

        }

 

    }

 

    for (j=0;j < 9;j++){

 

        for (i=0;i<9;i++)

        {

            s=(9*(i)+j);

            x += num[s];

        }

        

 

        

            if (x != 45)

        {

            t=1;

            x=0;

            goto end;

        } 

    else if (x == 45)

        {

            t=0;

            x=0;

        }

}

    for (j=0;j < 9;j++){

 

            for (i=0;i < 3;i++){

 

                for (u=0;u < 3;u++){

 

                    s=(u+(9*i))+3*j;

                    

                    if (j >=0 && j <=2)

                    f=s;

                    else if (j >= 3 && j<=5)

                    f=s+18;

                    else if (j>=6 && j<=8)

                    f=s+36;

                    

                    x += num[f];

                }

 

    }

 

 

    

    if (x != 45)

    {

        z=1,x=0;

goto end;

    }     

    else

        

        {

            z=0;

            x=0;

        }

 

    }

 

end:

    if (t == 0 && k==0 && z==0)

 

        printf("yes\n");

 

    else

 

        printf("no\n");

        

    }

 

return 0;

 

}


我幫你改了一下程式碼 偷懶的用了goto  因為你的if 判斷到錯誤後 旗標變了1 不過沒有中斷他所以又繼續判斷下去 如果把最後一行 最後一列 最後一個九宮格 都放成正確的數字 就會發生 明明其他是錯的 你還是會判斷成對的

舉個範例給你看

123456781

123456782

123456747

123457814

151211515

151515158

151515123

151515456

123456789

明明是錯的 但是你原本的程式碼 卻輸出yes