切换到宽版
  • 16653阅读
  • 14回复

请问是否能编程解决“数独”问题? [复制链接]

上一主题 下一主题
离线小僵
 
只看楼主 正序阅读 0 发表于: 2007-10-28
如题。如有,请给出程序。

注:数独指一个9*9的矩形方格,又分为9个3*3的矩形方格。
合理的数独要满足2个条件:
1、每行每列都只能且必须有1,2,3,4,5,6,7,8,9这9个数。
2、每个小矩形方格内同样只能且必须有这9个数;

数独问题即是给出你几个方格中的数,要求补完剩下的方格。
离线sxpeter
只看该作者 14 发表于: 2008-10-09
DFS是正解
离线zou
只看该作者 13 发表于: 2008-02-23
应该用枚举,
一个一个空找,
你知道多少种方法就上多少,
如果做不出,那么你不会比你的程序好到哪里去!
离线绝世衰神
只看该作者 12 发表于: 2008-01-31
楼上的那位,能写点注解么????
看不懂啊
天生我材必有用
老鼠儿子会打洞
离线leishiyao
只看该作者 11 发表于: 2007-12-12
#include<stdio.h>
#define N 100
FILE *fp;
int a[9][9],finish=0,o=0,biao[3][9][9],qu[9][9];
void print()
{
    int i,j;
    //fp=fopen(".\\output.txt","w");
    for(i=0;i<9;i++)
    {
                    for(j=0;j<9;j++)
                    {
                                    fprintf(fp,"%d ",a[j]);
                                    if((j+1)%3==0) fprintf(fp," ");
                    }
                    fprintf(fp,"\n");
                    if((i+1)%3==0) fprintf(fp,"\n");
    }
    fprintf(fp,"\n\n");
  // fclose(fp);
}
void run(int x)
{
    //if(o==0)
    {
            int i=0,j=0,y;
            for(;x<9;x++)
            {
                    for(y=0;y<9;y++)
                    {
                                    if(a[x][y]==0)
                                    {
                                                  for(i=1;i<=9;i++)
                                                  {
                                                                    if(biao[0][x][i-1]==1||biao[1][y][i-1]==1||biao[2][qu[x][y]][i-1]==1)
                                                                    continue;
                                                                    a[x][y]=i;
                                                                    biao[0][x][i-1]=1;
                                                                    biao[1][y][i-1]=1;
                                                                    biao[2][qu[x][y]][i-1]=1;
                                                                    finish++;
                                                                    if(finish==81)
                                                                    {
                                                                                o++;/*
                                                                                fp=fopen(".\\output.txt","w");
                                                                                fprintf(fp,"%d",o);
                                                                                fclose(fp);
                                                                                //*/
                                                                                print();
                                                                    }
                                                                    else run(x);
                                                                    if(o==N) break;
                                                                    a[x][y]=0;
                                                                    biao[0][x][i-1]=0;
                                                                    biao[1][y][i-1]=0;
                                                                    biao[2][qu[x][y]][i-1]=0;
                                                                    finish--;
                                                  }
                                                  break;
                                    }
                    }
                    if(o==N||i>9) break;
            }
    }
}

int main()
{
    int i,j,x,y;
    for(i=0;i<3;i++)
    {
                    for(x=0;x<3;x++)
                    {
                                    for(j=0;j<3;j++)
                                    {
                                                    for(y=0;y<3;y++) qu[3*i+x][3*j+y]=3*i+j;
                                    }
                    }
    }
    for(i=0;i<9;i++) {for(j=0;j<9;j++) {a[j]=0; biao[0][j]=0;biao[1][j]=0;biao[2][j]=0;}}
    if(fp=fopen(".\\input.txt","r"))
    {
    for(i=0;!feof(fp);i++)
    {
                          fscanf(fp,"%d%d%d",&x,&y,&j);
                          a[x-1][y-1]=j;
                          biao[0][x-1][j-1]=1;
                          biao[1][y-1][j-1]=1;
                          biao[2][qu[x-1][y-1]][j-1]=1;
    }
    finish=i;
    fclose(fp);
    }
/*    fp=fopen(".\\output.txt","w");
    for(i=0;i<9;i++)
    {
                    for(j=0;j<9;j++)
                    {
                                    if(a[j]!=0) fprintf(fp,"%d ",a[j]);
                                    else fprintf(fp,"X ");
                                    if((j+1)%3==0) fprintf(fp," ");
                    }
                    fprintf(fp,"\n");
                    if((i+1)%3==0) fprintf(fp,"\n");
    }
    fclose(fp);
    */
   
    fp=fopen(".\\output.txt","w");
    run(0);
    /*for(i=0;i<9;i++)
    {
                    for(j=0;j<9;j++)
                    {
                                    fprintf(fp,"%d ",a[j]);
                                    if((j+1)%3==0) fprintf(fp," ");
                    }
                    fprintf(fp,"\n");
                    if((i+1)%3==0) fprintf(fp,"\n");
    }*/
   
    fclose(fp);
   
    return 0;
}
输入格式:
每行三个数,表示M行N列的数字为I
离线eeee
只看该作者 10 发表于: 2007-11-25
数独问题,已经有了一个分布式计算项目:Sudoku Project [项目主页:http://dist2.ist.tugraz.at/sudoku;中文讨论页:http://www.equn.com/forum/viewthread.php?tid=16572]

这个项目运行在BOINC平台(新手指南:http://www.equn.com/forum/thread-16180-1-1.html);如果你有好的课题需要分布式计算,你也可以基于BOINC平台建设自己的分布式运算项目。中国分布式计算论坛(http://www.equn.com/forum/)或许能够帮助你。
离线181818181818
只看该作者 9 发表于: 2007-11-24
能!!
离线entropy
只看该作者 8 发表于: 2007-11-16
利用正则表达式
离线132conan
只看该作者 7 发表于: 2007-11-13
3楼的caoyuan9642能不能加个注释?
离线大壮
只看该作者 6 发表于: 2007-11-09
dps+剪枝。复杂度取决于已知的数。
快速回复
限100 字节
 
上一个 下一个