zoukankan      html  css  js  c++  java
  • 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("
    ");        
        }
        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("
    ");        
    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     
  • 相关阅读:
    1503: [NOI2004]郁闷的出纳员
    2049: [Sdoi2008]Cave 洞穴勘测
    2301: [HAOI2011]Problem b
    BZOJ 1923: [Sdoi2010]外星千足虫
    BZOJ 2115: [Wc2011] Xor
    POJ 1830 开关问题
    欧拉函数基础
    BZOJ 2186 沙拉公主的困惑
    POJ 1845
    逆元基础知识整理
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/7622848.html
Copyright © 2011-2022 走看看