题目点我点我点我
CCPC的H题,当时现场赛是连DFS都不会啊,唉o(︶︿︶)o
题目大意:数独
思路:直接暴力DFS,row[i][k]第i行数字为k的,col[i][k]第i列数字为k的。2*2的方块也必须是1234。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define inf 0x3f3f3f3f
pair<int,int>p[18];
int row[5][5],col[5][5],num,flag; //flag控制输出及递归的结束
char s[5][5];
bool check() //2*2的方块是否都有1234
{
if(((1<<s[1][1])|(1<<s[1][2])|(1<<s[2][1])|(1<<s[2][2]))!=30)return false;
if(((1<<s[1][3])|(1<<s[1][4])|(1<<s[2][3])|(1<<s[2][4]))!=30)return false;
if(((1<<s[3][1])|(1<<s[3][2])|(1<<s[4][1])|(1<<s[4][2]))!=30)return false;
if(((1<<s[3][3])|(1<<s[3][4])|(1<<s[4][3])|(1<<s[4][4]))!=30)return false;
return true;
}
void dfs(int cnt)
{
if(flag)return;
if(cnt>num)
{
if(check())
{
flag=1;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
s[i][j]+='0';
cout<<(s[i][j]);
}
printf("\n");
}
}
return;
}
int x=p[cnt].first;
int y=p[cnt].second;
for(int i=1;i<=4;i++)
{
if(!row[x][i] && !col[y][i])
{
row[x][i]=1;
col[y][i]=1;
s[x][y]=i;
dfs(cnt+1);
row[x][i]=0;
col[y][i]=0;
}
}
if(flag)return;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T,i,j,cas=1;
scanf("%d",&T);
while(T--)
{
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
num=0;
flag=0;
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
{
cin>>s[i][j];
if(s[i][j]!='*')
{
s[i][j]-='0';
int k=s[i][j];
row[i][k]=1;
col[j][k]=1;
}
else
{
p[++num]=make_pair(i,j); //*的行列记录下来
s[i][j]-='0';
}
}
}
printf("Case #%d:\n",cas++);
dfs(1);
}
return 0;
}