PKU 2918 Tudoku

http://poj.org/problem?id=2918
数独を解く。

前に書いたやつ(PKU2676)をコピー。

char in[9][10];
bool ver[9][9],hor[9][9],sq[9][9];

bool dfs(int ne){
  if(ne>80)return true;
  int x=ne/9,y=ne%9;
  if(in[x][y]!='0')return dfs(ne+1);

  int tx=x-x%3,ty=y-y%3;
  int sn=tx/3*3+ty/3;
  
  rep(i,9){
    if(ver[y][i] || hor[x][i] || sq[sn][i])continue;
    in[x][y]=i+'1';
    ver[y][i]=hor[x][i]=sq[sn][i]=true;
    if(dfs(ne+1))return true;
    ver[y][i]=hor[x][i]=sq[sn][i]=false;
  }
  in[x][y]='0';
  return false;
}

main(){
  int t;
  cin>>t;
  rep(ca,t){
    memset(ver,0,sizeof(ver));
    memset(hor,0,sizeof(hor));
    memset(sq,0,sizeof(sq));
    
    rep(i,9)scanf("%s",in[i]);
    rep(i,9){
      rep(j,9){
	if(in[i][j]=='0')continue;
	int nn=in[i][j]-'1';
	ver[j][nn]=true;
	hor[i][nn]=true;
	int tx=i-i%3,ty=j-j%3;
	int sn=tx/3*3+ty/3;
	sq[sn][nn]=true;
      }
    }

    dfs(0);
    cout<<"Scenario #"<<ca+1<<':'<<endl;
    rep(i,9)puts(in[i]);
    puts("");
  }
}