问道手游装备强化找谁:求解数独的源程序(c的或是pascal的都行)

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/23 17:02:17
需要一份完整的解数独的源程序(c的或是pascal的都行)

#include <stdio.h>
#include <conio.h>

typedef struct _grid99
{
int value[9][9];
char disp[9][9];
} grid99;

char x_status[9][9];
char y_status[9][9];
char z_status[9][9];

typedef struct _list9
{
int value[9];
char disp[9];
} list9;

list9 l;

void print(grid99 * g)
{
int i,j;
for(i=0; i<9; i++)
{
for(j=0; j<9; j++)
{
printf("%c ", g->disp[i][j]);
}
printf("\n");
}
printf("\n");
}

int check(grid99 * g)
{
int i,j,x,y, value;

for(i=0; i<9; i++)
{
value=0;
for(j=0; j<9; j++)
{
value+=g->value[i][j];
}
if (value!=511)
{
return -1;
}
value=0;
for(j=0; j<9; j++)
{
value+=g->value[j][i];
}
if (value!=511)
{
return -1;
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
value=0;
for(x=0;x<3;x++)
{
for(y=0;y<3;y++)
{
value+=g->value[i*3+x][j*3+y];
}
}
if (value!=511)
{
return -1;
}
}
}

print(g);

return 0;
}

int f(int a_n)
{
int i, r=1;

for(i=1;i<=a_n;i++)
{
r*=2;
}
return r;
}

void find(grid99 * g, int level)
{
int i, k, x, y, z, id;
if(level>=81)
{
printf("level>=81");
return;
}
x=level/9;
y=level%9;
z=(int)(x/3)*3+(int)(y/3);

for(i=0;i<9;i++)
{
if(x_status[x][i]=='Y' && y_status[y][i]=='Y' && z_status[z][i]=='Y')
{
g->value[x][y]=l.value[i];
g->disp[x][y]=l.disp[i];

x_status[x][i]='N';
y_status[y][i]='N';
z_status[z][i]='N';

if(level==80)
{
check(g);
}
else
{
find(g, level+1);
}
id=g->disp[x][y]-0x30-1;
x_status[x][id]='Y';
y_status[y][id]='Y';
z_status[z][id]='Y';

g->value[x][y]=0;
g->disp[x][y]=0x30;
}
}
}

main()
{
int i,j,k;

grid99 g;
for(i=0; i<9; i++)
{
l.value[i]=f(i);
l.disp[i]=i+0x30+1;
//printf("%c ", l.disp[i]);
//printf("%d ", l.value[i]);
for(j=0; j<9; j++)
{
g.value[i][j]=0;
g.disp[i][j]=0x30;
//printf("%c ", g.disp[i][j]);
//printf("%d ", g.value[i][j]);
}
for(k=0;k<9;k++)
{
x_status[i][k]='Y';
y_status[i][k]='Y';
z_status[i][k]='Y';
}
}

find(&g,0);
}
void main()
{
int i,j,tmp;
int a[9][9];
int row=9,line=9;

for(i=0;i<line;i++)
a[0][i]=i+1;

tmp=a[0][0];
for(i=1;i<row;i++)
{
for(j=0;j<line-1;j++)
a[i][j]=a[i-1][j+1];
a[i][j]=tmp;
tmp=a[i][0];
}
for(i=0;i<row;i++)
{
for(j=0;j<line;j++)
printf("%d ",a[i][j]);
printf("\n");
}

自己整了一个程序,用了点数据结构中的堆栈法则和一个结构体
不算文件录入,基本上是一秒一道题,就搞定了
所以已经不怎么想玩数独了
正在准备做一个图形界面的数独解题机,
减少文件录入的时间,呵呵