POJ 2965 The Pilots Brothers' refrigerator

来源:互联网 发布:支付系统网络硬件架构 编辑:程序博客网 时间:2024/06/10 04:18

这道题和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);elsedfs( r+1, 0, temp_step);}}


0 0
原创粉丝点击