超时了,觉得是dfs那里错误了,不过用这段代码肯定可以算数独游戏我觉得,所以保存以后再看看吧
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
const int LEN=10;
bool ma1[LEN][LEN], ma2[LEN][LEN], ma3[LEN][LEN];
bool ma[LEN][LEN][LEN];
char s[LEN][LEN];
int num;
bool flag=false, black;
typedef struct NODE
{
int r, c;
}arrays;
arrays arr[LEN*LEN];
void display()
{
if( black ) printf("\n");
int i, j=1;
for(i=1; i<LEN; i++)
{
j=1;
printf("%c", s[i][j]);
for(j=2; j<LEN; j++)
printf(" %c", s[i][j]);
printf("\n");
}
// printf("\n");
}
int getMa2ProcessSub(int i, int j)
{
int r=1;
if( i<=3 )
{
if( j<=3 ) r=1;
else if( j<=6 ) r=2;
else r=3;
}else if( i<=6 )
{
if( j<=3 ) r=4;
else if( j<=6 ) r=5;
else r=6;
}else
{
if( j<=3 ) r=7;
else if( j<=6 ) r=8;
else r=9;
}
return r;
}
void display2();
bool* tm, *tm1, *tm2;
void getMa1NotMarked(int r, int c)
{
bool tm3[LEN], tm4[LEN];
tm1=(bool*)malloc(LEN*sizeof(bool));
if( tm1==NULL )
{
printf("malloc error\n");
exit(0);
}
memset(tm1, true, LEN*sizeof(bool));
memset(tm3, true, LEN*sizeof(bool));
memset(tm4, true, LEN*sizeof(bool));
for(int j=1; j<LEN; j++)
{
if( ma1[r][j]==false )
tm3[j]=false;
}
for(int j=1; j<LEN; j++)
{
if( ma3[c][j]==false )
tm4[j]=false;
}
for(int i=0; i<LEN; i++)
{
tm1[i]=tm3[i] | tm4[i];
// printf("tm1[%d]=%d tm3=%d tm4=%d\n", i, tm1[i], tm3[i], tm4[i]);
}
//return tm;
}
void getMa2NotMarked(int i, int j)
{
tm2=(bool*)malloc(LEN*sizeof(bool));
if( tm2==NULL )
{
printf("malloc error\n");
exit(0);
}
memset(tm2, true, LEN*sizeof(bool));
int r=getMa2ProcessSub(i, j);
// printf("r=%d\n", r);
for(int j=1; j<LEN; j++)
{
if( ma2[r][j]==false )
tm2[j]=false;
// printf("tm2[%d]=%d\n", j, tm2[j]);
}
// printf("ma2=%d\n", tm2);
//return tm;
}
void getNotMarked(int r, int c)
{
tm=(bool*)malloc(LEN*sizeof(bool));
if( tm==NULL )
{
printf("malloc error\n");
exit(0);
}
// printf("getMa1NotMarked\n");
getMa1NotMarked(r, c);
// printf("getMa2NotMarked r=%d c=%d\n", r, c);
getMa2NotMarked(r, c);
// printf("tm2=%d\n", tm2);
// printf("getNotMarked\n");
for(int i=0; i<LEN; i++)
{
tm[i]=tm1[i] | tm2[i];
// printf("tm[%d]=%d\n", i, tm[i]);
}
// printf("step 114 \n");
free(tm1);
tm1=NULL;
free(tm2);
tm2=NULL;
// printf("getNotMarked finish\n");
//return tm;
}
void setMa()
{
// bool* tm=NULL;
//计算出每个?处可以填的值有哪些
// display2();
for(int i=0; i<num; i++)
{
getNotMarked(arr[i].r, arr[i].c);
for(int k=0; k<LEN; k++)
ma[arr[i].r][arr[i].c][k]=tm[k];
free(tm);
tm=NULL;
}
}
void init()
{
memset(ma1, false, sizeof ma1);
memset(ma2, false, sizeof ma2);
memset(ma3, false, sizeof ma3);
int i, j, sub;
for(i=1; i<LEN; i++)
{
for(j=1; j<LEN; j++)
if( s[i][j]!='?' )
{
sub=s[i][j]-'0';
ma1[i][sub]=true;
ma3[j][sub]=true;
ma2[getMa2ProcessSub(i, j)][sub]=true;
}
}
// printf("setMa\n");
setMa();
// printf("setMa finish\n");
}
void DFS(int x)
{
if( flag ) return;
if( x>=num )
{
display();
flag=true;
return;
}
int i, j;
i=arr[x].r;
j=arr[x].c;
for(int k=1; k<LEN; k++)
if( ma[i][j][k]==false && flag==false )
{
s[i][j]=k+'0';
// printf("s[%d][%d]=%c\n",i, j, s[i][j]);
init();
//display2();
//system("pause");
x++;
DFS(x);
if( flag ) return;
x--;
s[i][j]='?';
init();
}
return;
}
void myClear()
{
if( tm ) free(tm);
if( tm2 ) free(tm2);
if( tm1 ) free(tm1);
}
int main()
{
int i, j, k;
black=false;
while( scanf("%c", &s[1][1])!=EOF )
{
k=0;
flag=false;
for(i=1; i<LEN; i++)
{
if( i!=1 ) scanf("%c", &s[i][1]);
if( s[i][1]=='?' ) arr[k].r=i, arr[k++].c=1;
for(j=2; j<LEN; j++)
{
scanf(" %c", &s[i][j]);
if( s[i][j]=='?' ) arr[k].r=i, arr[k++].c=j;
}
getchar();
}
num=k;
// display();
// printf("num=%d\n", num);
init();
// display2();
DFS(0);
black=true;
myClear();
getchar();
}
return 0;
}
void display2()
{
printf("ma1\n");
for(int i=1; i<LEN; i++)
{
printf("%d", ma1[i][0]);
for(int j=1; j<LEN; j++)
{
printf(" %d", ma1[i][j]);
}
printf("\n");
}
printf("\nma2\n");
for(int i=1; i<LEN; i++)
{
printf("%d", ma2[i][0]);
for(int j=1; j<LEN; j++)
{
printf(" %d", ma2[i][j]);
}
printf("\n");
}
printf("\nma3\n");
for(int i=1; i<LEN; i++)
{
printf("%d", ma3[i][0]);
for(int j=1; j<LEN; j++)
{
printf(" %d", ma3[i][j]);
}
printf("\n");
}
for(int i=0; i<num; i++)
{
printf("(%d,%d) ", arr[i].r, arr[i].c);
}
printf("\n");
}