题意:每行每列每个九空格数字不同,输出一种符合题意即可
思路:
DFS&暴力
正着搜跑560,反着16ms;和这个题相似的题3074,数据厉害,这个代码过不了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int mp[10][10];
int mx[10][10];
int my[10][10];
int mk[10][10];
int cp;
struct node///需要填的空
{
int x; int y;
}ls[85];
int dfs(int st)
{
int i, j;
if(st == cp)
{
for(i = 0; i < 9; i++)
{
for(j = 0; j < 9; j++)
{
printf("%d",mp[i][j]);
}
printf("\n");
}
return 2;
}
int flag = 0;
for(i = 1; i <= 9; i++)
{
int x = ls[st].x;
int y = ls[st].y;
int k=3*((x)/3)+(y)/3+1;
if(!mx[x][i]&&!my[y][i]&&!mk[k][i])
{
mp[x][y] = i;
mx[x][i] = 1;
my[y][i] = 1;
mk[k][i] = 1;
flag = dfs(st+1);
if(flag == 2)
return 2;///满足条件,不再继续
mp[x][y] = 0;
mx[x][i] = 0;
my[y][i] = 0;
mk[k][i] = 0;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(mx,0,sizeof(mx));
memset(my,0,sizeof(my));
memset(mk,0,sizeof(mk));
int i, j;
cp = 0;
for(i = 0; i < 9; i++)
{
char c[15];
scanf("%s",c);
for(j = 0; j < 9; j++)
{
mp[i][j] = c[j]-'0';
if(mp[i][j] == 0)
{
ls[cp].x = i;
ls[cp].y = j;
cp++;
}
int k=3*(i/3)+j/3+1;
mx[i][mp[i][j]] = 1;///每行出现过的数字
my[j][mp[i][j]] = 1;///每列出现过的数字
mk[k][mp[i][j]] = 1;///每个3X3的九宫格出现过的数字
}
}
dfs(0);
}
return 0;
}