Hoj 3130 Qie-Gao

题目:http://acm.hit.edu.cn/hoj/problem/view?id=3130

本题练习深度优先搜索。

将所有的#标记为未标记,从上到下从左到右依次从每个没标记过的点开始广搜,搜到的点记为已标记,同时记录最小的xl,yl以及最大的xr,yr和搜到的点数。如果搜到的点数不等于根据xlylxryr计算出的矩形的面积,则说明有矩形相邻,否则就找到了一个矩形。依次计算即可。


#include <iostream>
#include <stdio.h>
#include <string.h>

#define Max 1003

char c[Max][Max];//从三点钟方向顺时针
int vis[Max][Max];
int total = 0;
int n,m;

int mx[4] = {0,1,0,-1};
int my[4] = {1,0,-1,0};

void dfs(int x,int y)
{
    if(x<0 || x>=n || y<0 || y>=m || c[x][y] == '.' || vis[x][y] == 1)
    {
        return;
    }
    vis[x][y] = 1;
    total++;
    for(int k=0;k<4;k++)
    {
        dfs(x+mx[k],y+my[k]);
    }

}
int getx(int x,int y)
{
    int tempx = 0;
    for(int i=x;i<n;i++)
    {
        if(c[i][y] == '.')
        {
            break;
        }
        else
        {
            tempx++;
        }
    }
    return tempx;
}
int gety(int x,int y)
{
    int tempy = 0;
    for(int i=y;i<m;i++)
    {
        if(c[x][i] == '.')
        {
            break;
        }
        else
        {
            tempy++;
        }
    }
    return tempy;
}
int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif


    while(scanf("%d %d",&n,&m)!=EOF && n!=0 && m!=0)
    {
        for(int i=0;i<n;i++)
        {
            scanf(" %s",c[i]);
        }
        memset(vis,0,sizeof(vis));
        int flag = 0;
        int num = 0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(c[i][j] == '#' && vis[i][j] == 0)
                {
                    total = 0;//搜索到的点的个数
                    dfs(i,j);
                    int tempx = getx(i,j);
                    int tempy = gety(i,j);
                    //printf("total = %d,tempx = %d,tempy = %d\n",total,tempx,tempy);
                    if(total!=tempx *tempy)
                    {
                        flag = 1;
                        break;
                    }
                    num++;
                }
            }
            if(flag == 1)
            {
                break;
            }
        }
        if(flag == 0)
        {
            printf("%d\n",num);
        }
        else
        {
            printf("Oh!My God!\n");
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值