http://poj.org/problem?id=1222
和poj 1753类似,1753是求全0或全1的步数,这题是求全0的解决方案。
当时是拿1753的代码改的,枚举步数,最多30步,这样的话状态总量就是2^30。。。
枚举第一行状态,共2^6,第一行确定了便可确定其余行,最后看末行是否全为0即可。
code:
#include<cstdio>
#include<cstring>
int map[
5][
6], ans[
5][
6] ;
int tur[
5][
2] = {
0,
0,
0,
1,
0, -
1,
1,
0, -
1,
0} ;
int flag ;
void Tur(
int x,
int y){
for(
int i=
0; i<
5; i++){
int tx = x + tur[i][
0] ;
int ty = y + tur[i][
1] ;
if(tx>=
0&&ty>=
0&&tx<
5&&ty<
6)
map[tx][ty] ^=
1 ;
}
}
void work(){
//
根据第一行的状态确定其余ans
for(
int i=
1; i<
5; i++)
for(
int j=
0; j<
6; j++)
if(map[i-
1][j]){
Tur(i, j) ;
ans[i][j] =
1 ;
}
}
void back(){
for(
int i=
1; i<
5; i++)
for(
int j=
0; j<
6; j++)
if(ans[i][j]){
Tur(i, j) ;
ans[i][j] =
0 ;
}
}
void test(){
flag =
1 ;
for(
int i=
0; i<
6; i++)
if(map[
4][i]==
1) flag =
0 ;
}
void print(){
int i, j ;
for(i=
0; i<
5; i++){
for(j=
0; j<
5; j++)
printf(
"
%d
", ans[i][j]) ;
printf(
"
%d\n
", ans[i][j]) ;
}
}
void dfs(
int y){
//
枚举第一行64种状态
if(flag)
return ;
if(y==
6){
work() ;
test() ;
if(flag) print() ;
else back() ;
}
else{
Tur(
0, y) ;
ans[
0][y] =
1 ;
dfs(y+
1) ;
Tur(
0, y) ;
ans[
0][y] =
0 ;
dfs(y+
1) ;
}
}
int main(){
int t=
0, i, j, n ;
scanf(
"
%d
", &n) ;
while(n--){
memset(ans,
0,
sizeof(ans)) ;
flag =
0 ;
for(i=
0; i<
5; i++)
for(j=
0; j<
6; j++)
scanf(
"
%d
", &map[i][j]) ;
printf(
"
PUZZLE #%d\n
", ++t) ;
dfs(
0) ;
}
return
0 ;}