这道题和POJ 1753 如出一辙,只是把变换函数改一下就完了。。。没想到AC得如此轻易,就当复习了吧
#include<stdio.h>
#include<string.h>
char a[4][4];
int num[4][4];
int ways[17][2];
int step, state = 0;
int judge( ){
int i, j;
for( i = 0; i < 4; i++)
for( j = 0; j < 4; j++)
if( num[i][j] == 0) return 0;
return 1;
}
int change( int r, int w){
int i, j;
for( i = 0; i < 4; i++){
num[i][w] = !num[i][w];
num[r][i] = !num[r][i];
}
num[r][w] = !num[r][w]; // 奇数次改变结果才改变,交叉点有2次改变,故多加一次
}
void dfs( int r, int w, int temp_step);
int main(void){
int i, j;
memset( num, 1, sizeof(num));
for( i = 0; i < 4; i++) gets(a[i]);
for( i = 0; i < 4; i++)
for( j = 0; j < 4; j++){
if( a[i][j] == '+') num[i][j] = 0;
}
if( judge()) step = 0;
else{
for( step = 1; step <= 16; step++){
dfs( 0, 0, 0);
if( state) break;
}
}
printf("%d\n", step);
for( i = 0; i < step; i++){
printf("%d %d\n", ways[i][0]+1, ways[i][1]+1);
}
return 0;
}
void dfs( int r, int w, int temp_step){
if( temp_step == step){
state = judge();
return;
}
else if( state || r == 4) return;
else{
change( r, w);
if( w < 3){
dfs( r, w+1, temp_step+1);
ways[temp_step][0] = r; // 记录步数
ways[temp_step][1] = w;
}
else{
dfs( r+1, 0, temp_step+1);
ways[temp_step][0] = r;
ways[temp_step][1] = w;
}
change( r, w);
if( w < 3)
dfs( r, w+1, temp_step);
else
dfs( r+1, 0, temp_step);
}
}