1. 程式人生 > >POJ 3923 Ugly Windows(——考察思維縝密性的模擬題)

POJ 3923 Ugly Windows(——考察思維縝密性的模擬題)

題意 stdio.h i++ lis stop 字母 include ide 輸入

題目鏈接:

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(——考察思維縝密性的模擬題)