题目:http://poj.org/problem?id=2676
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <map>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0xfffffff
#define MAXN 100105
using namespace std;
int num[9][9];
bool flag;
bool isOK(int x, int y, int k){
for(int i = 0; i < 9; i++){
if(num[x][i]==k)return false;
if(num[i][y]==k)return false;
}
int xx,yy;
xx = x/3;
yy = y/3;
for(int i = xx*3; i < (xx+1)*3; i++){
for(int j = yy*3; j < (yy+1)*3; j++){
if(num[i][j]==k)return false;
}
}
return true;
}
void dfs(int x, int y){
if(flag||x==9){
flag = true;
return;
}
while(1){
if(y==9){
y = 0;
x++;
}
if(x==9){
flag = true;
return;
}
if(num[x][y]==0)break;
y++;
}
for(int i = 1; i <= 9; i++){
if(!isOK(x,y,i))continue;
num[x][y] = i;
dfs(x,y+1);
if(flag)return;
num[x][y] = 0;
}
}
int main(){
int t;
cin>>t;
getchar();
while(t--){
char tmp;
for(int i = 0; i < 9; i++)
for(int j = 0; j < 10; j++){
scanf("%c",&tmp);
if(j!=9)num[i][j] = tmp-'0';
}
flag = false;
dfs(0,0);
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++)printf("%d",num[i][j]);
printf("\n");
}
}
}
总结: 很容易超时的深搜题. 同样的思路, 前几次提交一直超时, 经过多次优化减少元操作数后1400ms过了.