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

.NET 实现 Split字符切割

[ACM] hdu 3923 Invoker (Poyla计数,高速幂运算,扩展欧几里得或费马小定理)

263. Ugly Number

LeetcodeSuper Ugly Number

263. Ugly Number