POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)
Posted Reqaw’s Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)相关的知识,希望对你有一定的参考价值。
题目链接:
http://poj.org/problem?id=3923
题意描述:
输入一个n*m的屏幕
该屏幕内有至少一个对话框(每个对话框都有对应的字母表示)
判断并输出该屏幕内处于最表层的对话框是哪些(有多个的话按字典序)
解题思路:
很接近生活的一道模拟题,考察了思维的缜密性,尤其是出现嵌套情况时,应该输出里层的对话框编号即可。
AC代码:
#include<stdio.h> #include<string.h> #include<ctype.h> char map[110][110]; int istop(int sx,int sy,char x); //判断是否为表层对话框函数 int main() { int n,m,i,j,list[26],k,c; while(scanf("%d%d",&n,&m),n+m != 0) { memset(list,0,sizeof(list)); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf(" %c",&map[i][j]); if(isalpha(map[i][j])) list[map[i][j]-‘A‘]=1;//标记有哪些字母标号的对话框出现 } } for(i=0;i<26;i++) { if(list[i]) { for(j=1;j<=n;j++) { int flag=0; for(k=1;k<=m;k++) { if(map[j][k]-‘A‘==i) { list[i]=istop(j,k,map[j][k]); flag=1; break; } } if(flag) break; } } } for(i=0;i<26;i++) { if(list[i]) printf("%c",‘A‘+i); } printf("\n"); } return 0; } int istop(int sx,int sy,char x) { int i,j,r,c; i=sx; j=sy+1; while(map[i][j] == x) j++; j--; c=j;//记录该对话框的列数 if(map[i+1][j] != x) return 0; while(map[i][j] == x) i++; i--; r=i;//记录该对话框的行数 if(map[i][j-1]!=x) return 0; while(map[i][j] == x) j--; j++; if(map[i-1][j]!=x) return 0; while(map[i][j] == x) i--; i++; if(i!=sx &&j!=sy) return 0; for(i=sx+1;i<r;i++)//判断该对话框内是否有嵌套对话框 for(j=sy+1;j<c;j++) if(map[i][j]!=‘.‘) return 0; return 1; }
1 #include<stdio.h> 2 #include<string.h> 3 #include<ctype.h> 4 char map[110][110]; 5 int istop(int sx,int sy,char x); 6 int main() 7 { 8 int n,m,i,j,list[26],k,c; 9 while(scanf("%d%d",&n,&m),n+m != 0) 10 { 11 memset(list,0,sizeof(list)); 12 for(i=1;i<=n;i++) 13 { 14 for(j=1;j<=m;j++) 15 { 16 scanf(" %c",&map[i][j]); 17 if(isalpha(map[i][j])) 18 list[map[i][j]-‘A‘]=1; 19 } 20 } 21 for(i=0;i<26;i++) 22 { 23 if(list[i]) 24 { 25 for(j=1;j<=n;j++) 26 { 27 int flag=0; 28 for(k=1;k<=m;k++) 29 { 30 if(map[j][k]-‘A‘==i) 31 { 32 list[i]=istop(j,k,map[j][k]); 33 flag=1; 34 break; 35 } 36 } 37 if(flag) 38 break; 39 } 40 } 41 } 42 for(i=0;i<26;i++) 43 { 44 if(list[i]) 45 printf("%c",‘A‘+i); 46 } 47 printf("\n"); 48 } 49 return 0; 50 } 51 int istop(int sx,int sy,char x) 52 { 53 int i,j,r,c; 54 i=sx; 55 j=sy+1; 56 while(map[i][j] == x) 57 j++; 58 j--; 59 c=j; 60 if(map[i+1][j] != x) 61 return 0; 62 63 while(map[i][j] == x) 64 i++; 65 i--; 66 r=i; 67 if(map[i][j-1]!=x) 68 return 0; 69 70 while(map[i][j] == x) 71 j--; 72 j++; 73 if(map[i-1][j]!=x) 74 return 0; 75 76 while(map[i][j] == x) 77 i--; 78 i++; 79 if(i!=sx &&j!=sy) 80 return 0; 81 82 for(i=sx+1;i<r;i++) 83 for(j=sy+1;j<c;j++) 84 if(map[i][j]!=‘.‘) 85 return 0; 86
以上是关于POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)的主要内容,如果未能解决你的问题,请参考以下文章
UVA 136 & POJ1338 Ugly Numbers