首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求教,c兑现一个数独游戏计算

2012-07-05 
求教,c实现一个数独游戏计算用c怎么实现编程?具体的算法写写,这个题目说是芬兰数学家因卡拉花费3个月设计

求教,c实现一个数独游戏计算

用c怎么实现编程?具体的算法写写,这个题目说是芬兰数学家因卡拉花费3个月设计出了世界上迄今难度最大的数独游戏,而且它只有一个答案。

[解决办法]
参考:
http://download.csdn.net/download/llaizhu/3188132
[解决办法]
最痛苦的是 看着手痒 却无从下手
[解决办法]
dancingLink 可以解数独
[解决办法]

C/C++ code
#include <stdio.h>#include <stdlib.h>int getmap(int maps[],int data){    int i;    for(i=0;i<10;i++)        if(maps[i]==data)            return i;}int chkdata(int data[][9],int x,int y){    int i;    int sum1=0,sum2=0,sum3=0,or1=0,or2=0,or3=0;        for(i=0;i<9;i++)    {        sum1+=data[i][y];        or1|=data[i][y];        sum2+=data[x][i];        or2|=data[x][i];        sum3+=data[x-x%3+i%3][y-y%3+i/3];        or3|=data[x-x%3+i%3][y-y%3+i/3];    }    if((sum1!=or1) || (sum2!=or2) ||(sum3!=or3))        return 0;    return 1;}void initdata(int datain[][9],int dataout[][9],int maps[],int handlenum[][9]){    int i,j;    for(i=0;i<9;i++)        for(j=0;j<9;j++)        {            dataout[i][j]=maps[datain[i][j]];            if(datain[i][j]==0)                handlenum[i][j]=-1;            else                handlenum[i][j]=0;        }}int getdata(int data[][9],int x,int y){    int sum=0,i;    for(i=0;i<9;i++)    {        sum|=data[i][y];        sum|=data[x][i];        sum|=data[x-x%3+i%3][y-y%3+i/3];    }    return 511&(sum^511);}int calhandle(int datahandle[][9][10],int handlenum[][9],int maps[],int x,int y,int data){    int i=0,j,k;    for(j=1;j<10;j++)    {        k=maps[j]&data;        if(k!=0)            datahandle[x][y][i++]=maps[j];    }    handlenum[x][y]=i;}    main(){    int datain[9][9]={        {8,0,0,0,0,0,0,0,0},        {0,0,3,6,0,0,0,0,0},        {0,7,0,0,9,0,2,0,0},        {0,5,0,0,0,7,0,0,0},        {0,0,0,0,4,5,7,0,0},        {0,0,0,1,0,0,0,3,0},        {0,0,1,0,0,0,0,6,8},        {0,0,8,5,0,0,0,1,0},        {0,9,0,0,0,0,4,0,0}};    int maps[10]={0,1,2,4,8,16,32,64,128,256};    int datamap[9][9];    int datahandle[9][9][10];    int handlenum[9][9];    int findnum[9][9]={0};    int i,j,k;    initdata(datain,datamap,maps,handlenum);    for(i=0;i<9;i++)        for(j=0;j<9;j++)            if(handlenum[i][j]!=0)                calhandle(datahandle,handlenum,maps,i,j,getdata(datamap,i,j));    for(i=0;i<9;i++)        for(j=0;j<9;j++)        {            if(handlenum[i][j]==0)                continue;            datamap[i][j]=datahandle[i][j][findnum[i][j]++];            while(!chkdata(datamap,i,j))            {                if(findnum[i][j]!=handlenum[i][j])                    datamap[i][j]=datahandle[i][j][findnum[i][j]++];                else                {                    findnum[i][j]=0;                    datamap[i][j]=0;                    j--;                    if(j<0)                    {                        j=8;                        i--;                    }                    while(handlenum[i][j]==0 || (findnum[i][j]==handlenum[i][j] && handlenum[i][j]!=0))                    {                        if(handlenum[i][j]!=0)                        {                            findnum[i][j]=0;                            datamap[i][j]=0;                        }                        j--;                        if(j<0)                        {                            j=8;                            i--;                        }                        if(i<0)                        {                            printf("false");                            i=100;                            j=100;                            break;                        }                    }                    if(i==100)                        break;                    datamap[i][j]=datahandle[i][j][findnum[i][j]++];                    continue;                }                if(i==100)                    break;            }        }    system("cls");    printf("\n");    if(i!=100 && j!=100)    {        for(i=0;i<9;i++)        {            for(j=0;j<9;j++)                printf("%3d ",getmap(maps,datamap[i][j]));            printf("\n");        }    }    system("pause");} 


[解决办法]

8 1 2 7 5 3 6 4 9
9 4 3 6 8 2 1 7 5
6 7 5 4 9 1 2 8 3
1 5 4 2 3 7 8 9 6
3 6 9 8 4 5 7 2 1
2 8 7 1 6 9 5 3 4
5 2 1 9 7 4 3 6 8
4 3 8 5 2 6 9 1 7
7 9 6 3 1 8 4 5 2
请按任意键继续. . .
计算结果
[解决办法]
其实数独和8皇后一样可以遍深搜历解的

热点排行
Bad Request.