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 ;}
#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 ;}