UVA12113-Overlapping Squares(二进制枚举)

Problem UVA12113-Overlapping Squares

Accept:116  Submit:596

Time Limit: 3000 mSec

UVA12113-Overlapping Squares(二进制枚举) Problem Description

 UVA12113-Overlapping Squares(二进制枚举)

 

 

UVA12113-Overlapping Squares(二进制枚举) Input

The input consists of several test cases. Each test case is contained in ?ve lines and each line contains nine characters. If the horizontal border of a ?lled square is visible it is denoted with ‘ ’ (ASCII value 95) sign and if vertical border of a ?lled square is visible then it is denoted with ‘|’ (ASCII value 124) character. The board contains no other character than ‘ ’, ‘|’ and of course ‘ ’ (ASCII Value 32). The border lines of the squares can only be along the grid lines. Each board lines end with a ‘#’ (Hash character) which denotes the end of line. This character is not a part of the grid or square. The last test case is followed by a single zero, which should not be processed.

 

UVA12113-Overlapping Squares(二进制枚举) Output

For each test case, print the case number and ‘Yes’ or ‘No’, depending on whether it’s possible to form the target.

 

UVA12113-Overlapping Squares(二进制枚举) Sample Input

UVA12113-Overlapping Squares(二进制枚举)

 

UVA12113-Overlapping Squares(二进制枚举) Sample Ouput

Case 1: Yes
Case 2: Yes
Case 3: No
Case 4: Yes

 

题解:感觉最近做的题都十分考验代码能力(然而我很水),想到一共只有九种摆放方案之后这个题的思维就基本上结束了,所有的挑选方案只有2^9,直接二进制枚举,对于相同的挑选方案,不同的摆放顺序也会带来不同的覆盖结果,解决方法就是next_permutation(),预处理出来不同小正方形的覆盖格子的标号,接下来暴力就好。

 

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = (1<<9);
 6 const int N = 5,M = 9;
 7 const int kind = 9;
 8 
 9 int edge[9][8] = {{1,3,9,13,18,19,21,22}};
10 int core[9][4] = {{10,11,12,20}};
11 int bits[kind+1],target[N*M];
12 
13 int read(){
14     char str[20];
15     int cnt = 0,edges = 0;
16     for(int i = 0;i < N;i++){
17         gets(str);
18         if(str[0] == 0) return -1;
19         for(int j = 0;j < M;j++){
20             if(str[j] ==  ) target[cnt++] = 0;
21             else target[cnt++] = 1,edges++;
22         }
23     }
24     return edges;
25 }
26 
27 void init(){
28     for(int i = 0;i < 3;i++){
29         for(int j = 0;j < 3;j++){
30             if(!i && !j) continue;
31             int plus,minus;
32             if(j == 0) plus = 9,minus = 3;
33             else plus = 2,minus = 1;
34             for(int k = 0;k < 8;k++){
35                 edge[i*3+j][k] = edge[i*3+j-minus][k]+plus;
36             }
37             for(int k = 0;k < 4;k++){
38                 core[i*3+j][k] = core[i*3+j-minus][k]+plus;
39             }
40         }
41     }
42 }
43 
44 int bitcount(int s){
45     return s == 0 ? 0 : bitcount(s>>1)+(s&1);
46 }
47 
48 void bitpos(int s){
49     int cnt = 0;
50     for(int i = 0;i < 9;i++){
51         if(s&(1<<i)) bits[cnt++] = i;
52     }
53 }
54 
55 int iCase = 1;
56 
57 int main()
58 {
59 #ifdef GEH
60     freopen("helloworld.01,inp","r",stdin);
61 #endif
62     init();
63     int edge_cnt;
64     while(edge_cnt=read()){
65         if(edge_cnt == -1) break;
66         int tmp[M*N];
67         bool ok = false;
68         for(int s = 0;s < maxn;s++){
69             int n = bitcount(s);
70             bitpos(s);
71             if(n>6 || n*8<edge_cnt) continue;
72             do{
73                 memset(tmp,0,sizeof(tmp));
74                 for(int i = 0;i < n;i++){
75                     for(int j = 0;j < 8;j++){
76                         tmp[edge[bits[i]][j]] = 1;
77                     }
78                     for(int j = 0;j < 4;j++){
79                         tmp[core[bits[i]][j]] = 0;
80                     }
81                 }
82 
83                 if(memcmp(tmp,target,sizeof(target)) == 0){
84                     ok = true;
85                     break;
86                 }
87             }while(next_permutation(bits,bits+n));
88             if(ok) break;
89         }
90         printf("Case %d: ",iCase++);
91         if(ok) printf("Yes\n");
92         else printf("No\n");
93     }
94     return 0;
95 }

 

UVA12113-Overlapping Squares(二进制枚举)

上一篇:sqlserver 表连接更新字段


下一篇:网络安全从入门到精通 (第五章-3) MSSQL反弹注入