Http://poj.org/problem? Id = 2676
Simple DFS records rows, columns, and 3 × 3 squares with three arrays.
I don't know why I couldn't end the program at the beginning. I submitted the Tle twice and thought it was a problem of getchar.
Code:
# Include <cstdio>
# Include <iostream>
# Include <cstring>
Using namespace STD;
Bool C [10] [10];
Bool R [10] [10];
Bool s [4] [4] [10];
Bool vis [10] [10];
Char STR [10];
Int data [10] [10];
Bool flag;
Int cur (int x ){
If (x <3) return 1;
Else if (x <6) return 2;
Else return 3;
}
Void DFS (INT row, int col ){
If (ROW = 9 ){
Flag = true;
Return;
}
If (vis [row] [col]) {
If (COL = 8) DFS (row + 1, 0 );
Else DFS (row, Col + 1 );
}
Else {
Vis [row] [col] = true;
For (INT I = 1; I <= 9; I ++ ){
If (FLAG) break;
If (! R [row] [I] &! C [col] [I] &! S [cur (ROW)] [cur (COL)] [I]) {
Data [row] [col] = I;
R [row] [I] = true;
C [col] [I] = true;
S [cur (ROW)] [cur (COL)] [I] = true;
If (COL = 8)
DFS (row + 1, 0 );
Else
DFS (row, Col + 1 );
R [row] [I] = false;
C [col] [I] = false;
S [cur (ROW)] [cur (COL)] [I] = false;
}
}
Vis [row] [col] = false;
}
}
Int main (){
Int T, I, J;
Scanf ("% d", & T );
While (t --){
Memset (VIS, false, sizeof (VIS ));
For (I = 0; I <9; I ++ ){
Getchar ();
Scanf ("% s", STR );
For (j = 0; j <9; j ++ ){
Data [I] [J] = STR [J]-'0 ';
If (data [I] [J]> 0) vis [I] [J] = true;
}
}
Memset (C, false, sizeof (c ));
Memset (R, false, sizeof (R ));
Memset (S, false, sizeof (s ));
For (I = 0; I <9; I ++)
For (j = 0; j <9; j ++ ){
If (data [I] [J]> 0 ){
R [I] [DATA [I] [J] = true;
C [J] [DATA [I] [J] = true;
S [cur (I)] [cur (j)] [DATA [I] [J] = true;
}
}
Flag = false;
DFS (0, 0 );
For (I = 0; I <9; I ++ ){
For (j = 0; j <9; j ++)
Printf ("% d", data [I] [J]);
Printf ("\ n ");
}
}
Return 0;
}