CodeChef submission 128753 (C++ 4.0.0-8) plaintext list. Status: AC, problem J1, contest NOV09. By Awake (Awake), 2009-11-10 02:45:38.
#include<stdio.h> #include<iostream> using namespace std; int grid[9][9]; int rowinfo[9],colinfo[9],diaginfo[2],subgrid[9]; int inxb[81],counter,nob; int SudokuSolver(){ if(counter==nob)return 1; int i,x,y,num,boolent,choice,minchoice=10,tx,ty,tnum,z,ix; for(i=counter;i<nob;i++){ choice=9; tx=inxb[i]/9; ty=inxb[i]%9; tnum=rowinfo[tx] | colinfo[ty] | subgrid[3*(tx/3)+ty/3]; if(tx==ty)tnum|=diaginfo[0]; if(tx==8-ty)tnum|=diaginfo[1]; z=tnum; z=z>>1;//we are dealing with 9 bits before the last bit while(z){ choice-=(z&1); z=z>>1; } if(choice<minchoice){ minchoice=choice; x=tx;y=ty;num=tnum; ix=i; } } swap(inxb[counter],inxb[ix]); bool d1=(x==y),d2=(x==8-y); // num=num>>1; // cout<<x<<y<<endl; // cout<<num<<endl; for(i=1;i<10;i++){ boolent=1<<i; //cout<<(num&boolent)<<endl; if((num&boolent)==0){ //cout<<"hi"<<endl; grid[x][y]=i; rowinfo[x]=rowinfo[x] | boolent; colinfo[y]=colinfo[y] | boolent; subgrid[3*(x/3)+y/3]|=boolent; if(d1)diaginfo[0]|=boolent; if(d2)diaginfo[1]|=boolent; counter++; if(SudokuSolver()) return 1; counter--; rowinfo[x]=rowinfo[x]^boolent; colinfo[y]=colinfo[y]^boolent; subgrid[3*(x/3)+y/3]^=boolent; if(d1)diaginfo[0]^=boolent; if(d2)diaginfo[1]^=boolent; } } return 0; } int main(){ int t; while(t--){ int i,j,ent,a,b,boolent; char ch,in[10]; nob=0; diaginfo[0]=diaginfo[1]=0; for(i=0;i<9;i++) rowinfo[i]=colinfo[i]=subgrid[i]=0; for(i=0;i<9;i++){ for(j=0;j<9;j++){ if(in[j]=='.'){ grid[i][j]=0; inxb[nob++]=i*9+j; } else { ent=in[j]-48; grid[i][j]=ent; boolent=1<<ent; rowinfo[i]=rowinfo[i] | boolent; colinfo[j]=colinfo[j] | boolent; subgrid[3*(i/3)+j/3]|=boolent; if(i==j)diaginfo[0]|=boolent; if(i==8-j)diaginfo[1]|=boolent; } } } //no of choices int choice[81]; /*for(i=0;i<nob;i++){ choice[i]=9; int x=inxb[i]/9,y=inxb[i]%9,num; num=rowinfo[x] | colinfo[y] | subgrid[3*(x/3)+y/3]; if(x==y)num|=diaginfo[0]; if(x==8-y)num|=diaginfo[1]; num=num>>1;//we are dealing with 9 bits before the last bit while(num){ choice[i]-=(num&1); num=num>>1; } }*/ //sort inxb /*for(i=0;i<nob-1;i++){ for(j=0;j<nob-i-1;j++){ if(choice[j]>choice[j+1]){ swap(inxb[j],inxb[j+1]); swap(choice[j],choice[j+1]); } } }*/ counter=0; SudokuSolver(); // cout<<"Solved !!\n"; for(i=0;i<9;i++){ for(j=0;j<9;j++) } } }
Comments

