POJ 2965.The Pilots Brothers' refrigerator

来源:互联网 发布:spss剔除异常数据 编辑:程序博客网 时间:2024/06/06 01:29

题目:http://poj.org/problem?id=2965

AC代码(C++):

#include <iostream>#include <algorithm>#include <stdio.h>#include <vector>#include <queue>#include <math.h>#include <string>#include <string.h>#include <bitset>using namespace std;bool a[4][4];vector<int> r;vector<int> c;int cnt;int mincnt;bool fliped[4][4];bool minfliped[4][4];void dfs(int x, int y){if(x == 4){bool flag = true;for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++)if(a[i][j]==false)flag = false;if(flag == true){if(cnt<mincnt){mincnt = cnt;for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++)minfliped[i][j] = fliped[i][j];}}return;} if(y!=3)dfs(x,y+1);else dfs(x+1,0);for(int i = 0; i < 4; i++){a[x][i] = !a[x][i];a[i][y] = !a[i][y];}a[x][y] = !a[x][y];cnt++;fliped[x][y] = true;if(y!=3)dfs(x,y+1);else dfs(x+1,0);fliped[x][y] = false;cnt--;for(int i = 0; i < 4; i++){a[x][i] = !a[x][i];a[i][y] = !a[i][y];}a[x][y] = !a[x][y];}int main(){for(int i = 0; i < 4; i++){for(int j = 0; j < 4; j++){char tmp;cin>>tmp;if(tmp=='+')a[i][j] = false;else a[i][j] = true;}}cnt = 0;mincnt = 2147483647;memset(fliped,false,sizeof(fliped));memset(minfliped,false,sizeof(minfliped));dfs(0,0);cout<<mincnt<<endl;for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++)if(minfliped[i][j])cout<<i+1<<' '<<j+1<<endl;}
总结:

1.首先每个开关要不不动要不只操作一次(怎么想到的...)

2.因为1所以可以暴力深搜.

阅读全文
0 0
原创粉丝点击