poj3923:
题意:给出两个整数n、m表示屏幕的长宽。屏幕上有一些窗口,每个窗口都是矩形的,窗口的边框用同一个大写字母来表示,不同的窗口的大写字母必定不同。
由于窗口的重叠,有些窗口的有些部分被其他窗口覆盖。但是,肯定有一些窗口在最顶端,不被其他任何窗口覆盖。我们称这些窗口为“顶端窗口”。你的任务就是找出所有的顶端窗口。
题解:简单的模拟。结果我错了很多次啊。首先,没有考虑到边框的内部一定要是'.',然后是最坑就是每个窗口的高度和宽度都不能小于3,自己模拟能力还是很弱啊,要多打打。
1 #include2 #include 3 #include 4 #include 5 #include 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