poj 1753 2965
状态压缩+枚举
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <cstdlib> 5 #include <cmath> 6 #include <map> 7 #include <algorithm> 8 #include <list> 9 #include <ctime> 10 #include <set> 11 #include <queue> 12 13 using namespace std; 14 typedef long long ll; 15 16 int relation[4][4]; 17 int dx[] = { 1, 0, -1, 0 }; 18 int dy[] = { 0, 1, 0, -1 }; 19 void addone(int x, int y, int& res) { 20 if (x < 0 || x >= 4 || y < 0 || y >= 4) { 21 return; 22 } 23 int offset = x * 4 + y; 24 res = (res | (1 << offset)); 25 26 } 27 int main() { 28 string data[4]; 29 for (int i = 0; i < 4; i++) { 30 cin >> data[i]; 31 } 32 int dp, dpori; 33 dp = dpori = 0; 34 for (int i = 0; i < 4; i++) { 35 for (int j = 0; j < 4; j++) { 36 if (data[i][j] == 'b') { 37 addone(i, j, dp); 38 } 39 } 40 } 41 dpori = dp; 42 for (int i = 0; i < 4; i++) { 43 for (int j = 0; j < 4; j++) { 44 addone(i, j, relation[i][j]); 45 for (int k = 0; k < 4; k++) { 46 addone(i + dx[k], j + dy[k], relation[i][j]); 47 } 48 } 49 } 50 int res = 1000; 51 int allstate = (1 << 16) - 1; 52 for (int i = 0; i <= allstate; i++) { 53 dp = dpori; 54 int cun = 0; 55 56 for (int a = 0; a < 4; a++) { 57 for (int b = 0; b < 4; b++) { 58 int tnum = a * 4 + b; 59 if (i & (1 << tnum)) { 60 cun++; 61 dp = dp ^ (relation[a][b]); 62 } 63 } 64 } 65 if (0 == dp || allstate == dp) { 66 res = min(res, cun); 67 } 68 69 } 70 if (1000 == res) { 71 cout << "Impossible"; 72 return 0; 73 } 74 cout << res; 75 return 0; 76 }
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <cstdlib> 5 #include <cmath> 6 #include <map> 7 #include <algorithm> 8 #include <list> 9 #include <ctime> 10 #include <set> 11 #include <queue> 12 13 using namespace std; 14 typedef long long ll; 15 16 int relation[4][4]; 17 int dx[] = { 1, 0, -1, 0 }; 18 int dy[] = { 0, 1, 0, -1 }; 19 void addone(int x, int y, int& res) { 20 if (x < 0 || x >= 4 || y < 0 || y >= 4) { 21 return; 22 } 23 int offset = x * 4 + y; 24 res = (res | (1 << offset)); 25 26 } 27 int main() { 28 string data[4]; 29 /* string data[4]={"-+--","----","----","-+--"};*/ 30 for (int i = 0; i < 4; i++) { 31 cin >> data[i]; 32 } 33 int dp, dpori; 34 dp = dpori = 0; 35 for (int i = 0; i < 4; i++) { 36 for (int j = 0; j < 4; j++) { 37 if (data[i][j] == '+') { 38 addone(i, j, dp); 39 } 40 } 41 } 42 dpori = dp; 43 for (int i = 0; i < 4; i++) { 44 for (int j = 0; j < 4; j++) { 45 for (int k = 0; k < 4; k++) { 46 addone(i, k, relation[i][j]); 47 addone(k, j, relation[i][j]); 48 } 49 } 50 } 51 int res = 1000; 52 int restag=0; 53 int allstate = (1 << 16) - 1; 54 for (int i = 0; i <= allstate; i++) { 55 dp = dpori; 56 int cun = 0; 57 58 for (int a = 0; a < 4; a++) { 59 for (int b = 0; b < 4; b++) { 60 int tnum = a * 4 + b; 61 if (i & (1 << tnum)) { 62 cun++; 63 dp = dp ^ (relation[a][b]); 64 } 65 } 66 } 67 if (0 == dp ) { 68 if(res>cun){ 69 res = min(res, cun); 70 restag=i; 71 } 72 } 73 74 } 75 if (1000 == res) { 76 cout << "Impossible"; 77 return 0; 78 } 79 cout << res<<endl; 80 for(int i=0;i<16;i++){ 81 if(restag&(1<<i)){ 82 int x=i/4; 83 int y=i%4; 84 cout<<(x+1)<<" "<<(y+1)<<endl; 85 } 86 } 87 return 0; 88 }