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