69,379
社区成员
发帖
与我相关
我的任务
分享
#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");
}