poj 1753 2965
2013-03-31 22:21
232 查看
状态压缩+枚举
#include <iostream> #include <string> #include <vector> #include <cstdlib> #include <cmath> #include <map> #include <algorithm> #include <list> #include <ctime> #include <set> #include <queue> using namespace std; typedef long long ll; int relation[4][4]; int dx[] = { 1, 0, -1, 0 }; int dy[] = { 0, 1, 0, -1 }; void addone(int x, int y, int& res) { if (x < 0 || x >= 4 || y < 0 || y >= 4) { return; } int offset = x * 4 + y; res = (res | (1 << offset)); } int main() { string data[4]; for (int i = 0; i < 4; i++) { cin >> data[i]; } int dp, dpori; dp = dpori = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (data[i][j] == 'b') { addone(i, j, dp); } } } dpori = dp; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { addone(i, j, relation[i][j]); for (int k = 0; k < 4; k++) { addone(i + dx[k], j + dy[k], relation[i][j]); } } } int res = 1000; int allstate = (1 << 16) - 1; for (int i = 0; i <= allstate; i++) { dp = dpori; int cun = 0; for (int a = 0; a < 4; a++) { for (int b = 0; b < 4; b++) { int tnum = a * 4 + b; if (i & (1 << tnum)) { cun++; dp = dp ^ (relation[a][b]); } } } if (0 == dp || allstate == dp) { res = min(res, cun); } } if (1000 == res) { cout << "Impossible"; return 0; } cout << res; return 0; }
#include <iostream> #include <string> #include <vector> #include <cstdlib> #include <cmath> #include <map> #include <algorithm> #include <list> #include <ctime> #include <set> #include <queue> using namespace std; typedef long long ll; int relation[4][4]; int dx[] = { 1, 0, -1, 0 }; int dy[] = { 0, 1, 0, -1 }; void addone(int x, int y, int& res) { if (x < 0 || x >= 4 || y < 0 || y >= 4) { return; } int offset = x * 4 + y; res = (res | (1 << offset)); } int main() { string data[4]; /* string data[4]={"-+--","----","----","-+--"};*/ for (int i = 0; i < 4; i++) { cin >> data[i]; } int dp, dpori; dp = dpori = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (data[i][j] == '+') { addone(i, j, dp); } } } dpori = dp; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { for (int k = 0; k < 4; k++) { addone(i, k, relation[i][j]); addone(k, j, relation[i][j]); } } } int res = 1000; int restag=0; int allstate = (1 << 16) - 1; for (int i = 0; i <= allstate; i++) { dp = dpori; int cun = 0; for (int a = 0; a < 4; a++) { for (int b = 0; b < 4; b++) { int tnum = a * 4 + b; if (i & (1 << tnum)) { cun++; dp = dp ^ (relation[a][b]); } } } if (0 == dp ) { if(res>cun){ res = min(res, cun); restag=i; } } } if (1000 == res) { cout << "Impossible"; return 0; } cout << res<<endl; for(int i=0;i<16;i++){ if(restag&(1<<i)){ int x=i/4; int y=i%4; cout<<(x+1)<<" "<<(y+1)<<endl; } } return 0; }
相关文章推荐
- POJ 2965 DFS解法 原理与1753类似 稍加改造即可ac
- poj 1753 & poj 2965
- [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
- POJ 1753 和 2965这个对现在的我来说不是水体,不能增加自信。。
- POJ——2965(枚举,类似1753)
- poj 1753/2965 bfs+位运算(关灯游戏/开冰箱门)
- poj 1753||poj 2965 枚举+dfs
- POJ基本算法bfs1753,2965
- POJ 1753 POJ 2965 解题报告
- poj_1753
- 第一天 POJ 1753
- POJ:1753-Flip Game(二进制+bfs)
- poj 2965 The Pilots Brothers' refrigerator(dfs)
- poj 1753 Flip Game
- poj 1753 flip[ 枚举 ]
- poj 2965 The Pilots Brothers' refrigerator[ 枚举 ]
- poj1753解题报告(1):DFS算法
- poj1753--flipgame---位运算 + bfs
- poj 1753
- poj2965 The Pilots Brothers' refrigerator —— 技巧性