天天看點

哭吧!喜歡玩數獨遊戲的親們!你被取代了——C語言解數獨

當時大學新買的Nokia手機上有這個遊戲,玩着玩着突然想能不能寫個程式來解題,因為當時在學C語言,于是乎……

原文在QQ空間,現在整理到CSDN上供大家吐槽

先上代碼

#include<stdio.h>
#include<conio.h>
int str[][];
void output();
void main()
{
    //定義
    int i,j,k,num,flag=,count=;
    int control=,con=;
    int cishu=;
    //輸入
    printf("請輸入81個數,空位用“0”代替:\n");
    for(i=;i<;i++)
    {
        for(j=;j<;j++)
        {
            scanf("%1d",&str[i][j]);
        }
    }
    //處理
    while(con==)
    {
        con=;
        for(i=;i<;i++)
        {       
            for(j=;j<;j++)
            {               
                if(str[i][j]==)
                {
                    //
                    //試值開始
                    for(num=;num<=;num++)
                    {                               
                        flag=;                                                 
                        //不同于九格
                        if(i%==&&j%==)
                        {
                            if(num!=str[i][j+]&&num!=str[i][j+]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j+]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j+])
                            {
                                flag=;
                            }
                        }
                        else if(i%==&&j%==)
                        {
                            if(num!=str[i][j+]&&num!=str[i][j-]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j-]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j-])
                            {
                                flag=;
                            }
                        }
                        else if(i%==&&j%==)
                        {
                            if(num!=str[i][j-]&&num!=str[i][j-]&&num!=str[i+][j]&&num!=str[i+][j-]&&num!=str[i+][j-]&&num!=str[i+][j]&&num!=str[i+][j-]&&num!=str[i+][j-])
                            {
                                flag=;
                            }
                        }
                        else if(i%==&&j%==)
                        {
                            if(num!=str[i][j+]&&num!=str[i][j+]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j+]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j+])
                            {
                                flag=;
                            }
                        }
                        else if(i%==&&j%==)
                        {
                            if(num!=str[i][j+]&&num!=str[i][j-]&&num!=str[i+][j]&&num!=str[i+][j+]&&num!=str[i+][j-]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j-])
                            {
                                flag=;
                            }
                        }
                        else if(i%==&&j%==)
                        {
                            if(num!=str[i][j-]&&num!=str[i][j-]&&num!=str[i+][j]&&num!=str[i+][j-]&&num!=str[i+][j-]&&num!=str[i-][j]&&num!=str[i-][j-]&&num!=str[i-][j-])
                            {
                                flag=;
                            }           
                        }
                        else if(i%==&&j%==)
                        {
                            if(num!=str[i][j+]&&num!=str[i][j+]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j+]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j+])
                            {
                                flag=;
                            }
                        }
                        else if(i%==&&j%==)
                        {
                            if(num!=str[i][j+]&&num!=str[i][j-]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j-]&&num!=str[i-][j]&&num!=str[i-][j+]&&num!=str[i-][j-])
                            {
                                flag=;
                            }
                        }
                        else if(i%==&&j%==)
                        {
                            if(num!=str[i][j-]&&num!=str[i][j-]&&num!=str[i-][j]&&num!=str[i-][j-]&&num!=str[i-][j-]&&num!=str[i-][j]&&num!=str[i-][j-]&&num!=str[i-][j-])
                            {
                                flag=;
                            }
                        }
                        //不同與九格結束
                        //不同于行列檢測
                        if(flag==)
                        {       
                            //不同于行
                            for(k=;k<;k++)
                            {       
                                if(k!=i)
                                    if(num==str[k][j])                                      
                                    {                                   
                                        control=;
                                    }
                            }
                            //不同于列
                            if(control==)
                                for(k=;k<;k++)
                                {   
                                    if(k!=j)
                                        if(num==str[i][k])
                                        {
                                            control=;
                                        }
                                }
                            //不同于行列結束
                        }//不同于行列檢測結束
                        if((control==)&&(flag==))
                        {
                            str[i][j]=num;
                            count++;
                        }
                        control=;                      
                    }//試值結束
                    if(count>)
                    {
                        str[i][j]=;
                    }
                    count=;
                }//if(str[i][j]==0)控制結束
            }//每行中每列處理結束
        }//每行處理結束
        //檢測是否全部指派
        for(i=;i<;i++)
            for(j=;j<;j++)
            {
                if(str[i][j]==)
                {
                    con=;
                }
            }
        //分次輸出
        printf("第%d次處理",++cishu);
        output();
    }//while(con)結束
    //輸出
    output();
    //結束
    getch();
}//main結束
void output()
{   
    int i,j;
    printf("答案為:\n");
    for(i=;i<;i++)
    {
        for(j=;j<;j++)
        {
            printf(" %d ",str[i][j]);
        }
        printf("\n");
    }
}
           

别罵街,畢竟當時大一……

思路

  1. 輸入:有數寫數,空寫0
  2. 循環中以0為控制條件,如果a[i][j]==0進行操作。

    if(a[i][j]==0)

  3. 每行每列都不同

    a[i][j]!=a[i][m]&&a[i][j]!=a[m][j]

  4. 每九個數不同

    如果行号對三求餘 且列号對三求餘

  5. 如果一個位置被連續兩次或以上指派,歸零

    用count++來控制

  6. 測試用資料
0 7 0 3 0 4 0 6 0
0 4 0 0 5 0 1 0 8
3 0 0 9 0 1 4 2 7
0 2 8 0 0 5 3 0 0
0 6 9 0 0 2 7 4 0
0 0 5 1 0 6 9 0 0
2 0 3 0 1 9 0 0 4
6 0 0 0 0 3 0 0 1
0 0 0 7 0 8 2 0 0
           

繼續閱讀