1. 程式人生 > >poj2965 The Pilots Brothers' refrigerator

poj2965 The Pilots Brothers' refrigerator

turn style bool blog splay getch 高斯 tps tails

這題有人用毒瘤的高斯消元做,也有人DFS,BFS,還有人證明性質然後直接計算,而我選擇了最暴力的方法:

2^16枚舉!

一算復雜度發現最壞情況是65536×16×4,無壓力......

秒A

技術分享圖片
 1 #include <cstdio>
 2 using namespace std;
 3 
 4 bool a[4][4], d[4][4];
 5 
 6 inline bool open() {
 7     for(int i = 0; i <= 3; i++) {
 8         for(int j = 0; j <= 3; j++) {
 9             if
(a[i][j]) { 10 return 0; 11 } 12 } 13 } 14 return 1; 15 } 16 17 inline void click(int k) { 18 int x = k / 4, y = k % 4; 19 for(int i = 0; i <= 3; i++) { 20 a[i][y] ^= 1; 21 a[x][i] ^= 1; 22 } 23 a[x][y] ^=1; 24 return; 25
} 26 27 inline void out(int k) { 28 int ans = 0; 29 for(int i = 0; i <= 15; i++) { 30 if(k & (1 << i)) { 31 ans++; 32 } 33 } 34 printf("%d\n", ans); 35 for(int i = 0; i <= 15; i++) { 36 if(k & (1 << i)) { 37 printf("
%d %d\n", i / 4 + 1, i % 4 + 1); 38 } 39 } 40 return; 41 } 42 43 int main() { 44 for(int i = 0; i <= 3; i++) { 45 for(int j = 0; j <= 3; j++) { 46 char c = getchar(); 47 while(c != + && c != -) { 48 c = getchar(); 49 } 50 d[i][j] = (c == +); 51 } 52 } 53 for(int i = 0; i < (1 << 16); i++) { 54 for(int j = 0; j <= 3; j++) { 55 for(int k = 0; k <= 3; k++) { 56 a[j][k] = d[j][k]; 57 } 58 } 59 for(int j = 0; j <= 15; j++) { 60 if(i & (1 << j)) { 61 click(j); 62 } 63 } 64 if(open()) { 65 out(i); 66 return 0; 67 } 68 } 69 printf("No solution!"); 70 return 0; 71 }
AC代碼

poj2965 The Pilots Brothers' refrigerator