Ugly Windows

poj3923:http://poj.org/problem?id=3923

题意:给出两个整数n、m表示屏幕的长宽。屏幕上有一些窗口,每个窗口都是矩形的,窗口的边框用同一个大写字母来表示,不同的窗口的大写字母必定不同。

由于窗口的重叠,有些窗口的有些部分被其他窗口覆盖。但是,肯定有一些窗口在最顶端,不被其他任何窗口覆盖。我们称这些窗口为“顶端窗口”。你的任务就是找出所有的顶端窗口。

题解:简单的模拟。结果我错了很多次啊。首先,没有考虑到边框的内部一定要是'.',然后是最坑就是每个窗口的高度和宽度都不能小于3,自己模拟能力还是很弱啊,要多打打。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 bool visit[30],ans[30];
 8 char mp[102][102];
 9 struct Node{
10    int x1,y1;
11    int x2,y2;
12 }num[30];
13 int n,m;
14 int main(){
15     while(~scanf("%d%d",&n,&m)){
16         if(n==0&&m==0)break;
17         if(n<3||m<3)continue;
18         memset(visit,0,sizeof(visit));
19         memset(num,0,sizeof(num));
20         memset(mp,0,sizeof(mp));
21         memset(ans,0,sizeof(ans));
22         for(int i=0;i<=29;i++){
23             num[i].x1=num[i].y1=1000;
24             num[i].x2=num[i].y2=0;
25         }
26         for(int i=1;i<=n;i++)
27             for(int j=1;j<=m;j++){
28                 cin>>mp[i][j];
29                 if(mp[i][j]!='.'){
30                     num[mp[i][j]-'A'].x1=min(num[mp[i][j]-'A'].x1,i);
31                     num[mp[i][j]-'A'].y1=min(num[mp[i][j]-'A'].y1,j);
32                     num[mp[i][j]-'A'].x2=max(num[mp[i][j]-'A'].x2,i);
33                     num[mp[i][j]-'A'].y2=max(num[mp[i][j]-'A'].y2,j);
34                     visit[mp[i][j]-'A']=1;
35                 }
36             }
37         for(int i=0;i<=29;i++){
38             if(visit[i]){
39                 int t1=num[i].x1;
40                 int t2=num[i].y1;
41                 int t3=num[i].x2;
42                 int t4=num[i].y2;
43                 bool flag=false;
44                for(int j=t2;j<=t4;j++){
45                  if((mp[t1][j]!=('A'+i))||(mp[t3][j]!=('A'+i))){
46                     flag=true;
47                     break;
48                  }
49                }
50                 for(int j=t1;j<=t3;j++){
51                  if(mp[j][t2]!=('A'+i)||mp[j][t4]!=('A'+i)){
52                     flag=true;
53                     break;
54                  }
55                }
56                if(t3-t1<2||t4-t2<2)flag=true;
57             if(!flag)
58               ans[i]=1;
59             }
60         }
61         for(int i=0;i<=29;i++){
62            if(visit[i]){
63               for(int k=num[i].x1+1;k<num[i].x2;k++){
64                 for(int j=num[i].y1+1;j<num[i].y2;j++){
65                     if(mp[k][j]!='.')
66                         ans[i]=0;
67                 }
68               }
69            }
70         }
71         for(int i=0;i<=29;i++)
72             if(ans[i])
73             printf("%c",i+'A');
74        printf("
");
75     }
76 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3886566.html