题目意思:
这道题和POJ2676一样,好像比那个还要简单,不知道比赛的时候为啥卡了
思路:
用3个标记数组,用来存取当前行和列还有2X2的小方格中数字是否出现,再加一个DFS就可以了
CODE
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<stack>
using namespace std;
int mx[5][5];
int my[5][5];
int mk[5][5];
int mp[5][5];
int get(int x, int y)
{
if(x < 2&& y < 2)
return 1;
else if(x <2&&y>=2)
return 2;
else if(x >= 2 && y < 2)
return 3;
else if(x >= 2 && y >= 2)
return 4;
}
struct node
{
int x, y;
}ls[25];
int knum;
int dfs(int num)
{
if(num ==knum)
{
return 2;
}
else
{
int x = ls[num].x, y = ls[num].y;
for(int i = 1; i <= 4; i++)
{
if(!mx[x][i]&&!my[y][i]&&!mk[get(x,y)][i])
{
mx[x][i] = 1;
my[y][i] = 1;
mk[get(x,y)][i] = 1;
mp[x][y] = i;
int ke;
ke = dfs(num+1);
if(ke == 2)
return 2;
mx[x][i] = 0;
my[y][i] = 0;
mk[get(x,y)][i] = 0;
mp[x][y] = 0;
}
}
}
}
int main()
{
int t;
cin>>t;
int io = 1;
while(t--)
{
char s[10], c;
knum = 0;
memset(mx,0,sizeof(mx));
memset(my,0,sizeof(my));
memset(mk,0,sizeof(mk));
for(int i = 0; i < 4; i++)
{
scanf("%s",s);
for(int j = 0; j < 4; j++)
{
c = s[j];
if(c == '*'){
mp[i][j] = 0;
ls[knum].x = i;
ls[knum++].y = j;
}
else{
mx[i][c-'0'] = 1;
my[j][c-'0'] = 1;
mk[get(i,j)][c-'0'] = 1;
mp[i][j] = c-'0';
}
}
}
dfs(0);
printf("Case #%d:\n",io++);
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
cout<<mp[i][j];
cout<<endl;
}
}
return 0;
}