zoukankan      html  css  js  c++  java
  • Ugly Windows

    poj3923:http://poj.org/problem?id=3923

    题意:给出两个整数n、m表示屏幕的长宽。屏幕上有一些窗口,每个窗口都是矩形的,窗口的边框用同一个大写字母来表示,不同的窗口的大写字母必定不同。

    由于窗口的重叠,有些窗口的有些部分被其他窗口覆盖。但是,肯定有一些窗口在最顶端,不被其他任何窗口覆盖。我们称这些窗口为“顶端窗口”。你的任务就是找出所有的顶端窗口。

    题解:简单的模拟。结果我错了很多次啊。首先,没有考虑到边框的内部一定要是'.',然后是最坑就是每个窗口的高度和宽度都不能小于3,自己模拟能力还是很弱啊,要多打打。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     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<num[i].x2;k++){
    64                 for(int j=num[i].y1+1;j<num[i].y2;j++){
    65                     if(mp[k][j]!='.')
    66                         ans[i]=0;
    67                 }
    68               }
    69            }
    70         }
    71         for(int i=0;i<=29;i++)
    72             if(ans[i])
    73             printf("%c",i+'A');
    74        printf("
    ");
    75     }
    76 }
    View Code
  • 相关阅读:
    C#进阶-Linq-join
    C#进阶-Linq
    C#-string-stringBuilder
    C#-继承-多态
    Spring基础
    JQuery基本操作
    Oracle数据库基础操作
    AJAX前端后端
    AJAX异步提交(前端)
    js基本操作
  • 原文地址:https://www.cnblogs.com/chujian123/p/3886566.html
Copyright © 2011-2022 走看看