找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3189|回复: 0
收起左侧

超音速解数独,自行编译运行(C语言版),按题目输入就行了。

[复制链接]
ID:82781 发表于 2015-6-13 19:52 | 显示全部楼层 |阅读模式
此程序多解只出一个解,需要多解请自行修改,或者联系本人。。。
你一定听说过“数独”游戏。
如:
玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
数独的答案都是唯一的,所以,多个解也称为无解。
本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。
本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。
格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。
例如:
输入(即图中题目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
程序应该输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764
再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400
程序应该输出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452

代码如下:
#include<stdio.h>
int ds[9][9],sd[9][9];int temp=0;
void tspd(int a[],int count)
{
         inti,j,k;
         if(temp)
         return;
         if(count<0)
         {        
                  
                            {for(i=0;i<9;i++)
                            {
                            for(j=0;j<9;j++)
                            printf("%d",ds[ i][j]);
                            printf("\n");
                            }printf("\n");}
                            temp=1;
                   return;
         }
         else
         {                 
                   i=a[count]/10;
                   j=a[count]%10;
                   for(k=1;k<=9;k++)
                   {        int x;                  
                            ds[ i][j]=k;
                            for(x=0;x<9;x++)
                            if(ds[ i][j]==sd[ i][x]){x=100;break;}
                            if(x==100)continue;
                            for(x=0;x<9;x++)
                            if(ds[ i][j]==sd[x][j]){x=100;break;}
                            if(x==100)continue;
                            if(j<8&&ds[ i][j]==ds[ i][j+1])continue;
                            if(j<7&&ds[ i][j]==ds[ i][j+2])continue;
                            if(j<6&&ds[ i][j]==ds[ i][j+3])continue;
                            if(j<5&&ds[ i][j]==ds[ i][j+4])continue;
                            if(j<4&&ds[ i][j]==ds[ i][j+5])continue;
                            if(j<3&&ds[ i][j]==ds[ i][j+6])continue;
                            if(j<2&&ds[ i][j]==ds[ i][j+7])continue;
                            if(j<1&&ds[ i][j]==ds[ i][j+8])continue;
                            if(i<8&&ds[ i][j]==ds[i+1][j])continue;
                            if(i<7&&ds[ i][j]==ds[i+2][j])continue;
                            if(i<6&&ds[ i][j]==ds[i+3][j])continue;
                            if(i<5&&ds[ i][j]==ds[i+4][j])continue;
                            if(i<4&&ds[ i][j]==ds[i+5][j])continue;
                            if(i<3&&ds[ i][j]==ds[i+6][j])continue;
                            if(i<2&&ds[ i][j]==ds[i+7][j])continue;
                            if(i<1&&ds[ i][j]==ds[i+8][j])continue;
                            if(i<8&&i>5)
                            {
                                     if(j%3==2&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j-2]))continue;
                                     if(j%3==1&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j+1]))continue;
                                     if(j%3==0&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j+1]||ds[ i][j]==ds[i+1][j+2]))continue;
                            }
                            if(i==6)
                            {
                                     if(j%3==2&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j-2]))continue;
                                     if(j%3==1&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j+1]))continue;
                                     if(j%3==0&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j+1]||ds[ i][j]==ds[i+2][j+2]))continue;
                            }
                            if(i<5&&i>2)
                            {
                                     if(j%3==2&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j-2]))continue;
                                     if(j%3==1&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j+1]))continue;
                                     if(j%3==0&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j+1]||ds[ i][j]==ds[i+1][j+2]))continue;
                            }
                            if(i==3)
                            {
                                     if(j%3==2&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j-2]))continue;
                                     if(j%3==1&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j+1]))continue;
                                     if(j%3==0&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j+1]||ds[ i][j]==ds[i+2][j+2]))continue;
                            }
                            if(i<2&&i>=0)
                            {
                                     if(j%3==2&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j-2]))continue;
                                     if(j%3==1&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j-1]||ds[ i][j]==ds[i+1][j+1]))continue;
                                     if(j%3==0&&(ds[ i][j]==ds[i+1][j]||ds[ i][j]==ds[i+1][j+1]||ds[ i][j]==ds[i+1][j+2]))continue;
                            }
                            if(i==0)
                            {
                                     if(j%3==2&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j-2]))continue;
                                     if(j%3==1&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j-1]||ds[ i][j]==ds[i+2][j+1]))continue;
                                     if(j%3==0&&(ds[ i][j]==ds[i+2][j]||ds[ i][j]==ds[i+2][j+1]||ds[ i][j]==ds[i+2][j+2]))continue;
                            }
                            tspd(a,count-1);
                   }
                   return;
         }
}
int main()
{
         inti,j,a[81],count=0;
         charc;
         for(i=0;i<9;i++)
         for(j=0;j<9;j++)
         {
                   c=getchar();
                   if(c=='\n')
                   c=getchar();
                   ds[ i][j]=(int)(c-'0');
         }
         for(i=0;i<9;i++)
         for(j=0;j<9;j++)
         sd[ i][j]=ds[ i][j];
         printf("\n");
         for(i=0;i<9;i++)
         for(j=0;j<9;j++)
                   if(!ds[ i][j])
                   a[count++]=i*10+j;
         tspd(a,count-1);
         return0;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表