码迷,mamicode.com
首页 > 其他好文 > 详细

NYOJ 27 水池数目

时间:2015-06-02 11:19:06      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:c++   acm   

时间限制:3000 ms  |  内存限制:65535 KB

难度:4

  • 描述

  • 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。

    • 输入

    • 第一行输入一个整数N,表示共有N组测试数据
      每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面)

    • 输出

    • 输出该地图中水池的个数。
      要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。

    • 样例输入

    • 2
      3 4
      1 0 0 0 
      0 0 1 1
      1 1 1 0
      5 5
      1 1 1 1 0
      0 0 1 0 1
      0 0 0 0 0
      1 1 1 0 0
      0 0 1 1 1
    • 样例输出

    • 2
      3


一开始没想到去修改地图上的数值,而是多用了一个数组,相对标程复杂


#include <iostream>
 
using namespace std;
 
int m1,m2;
int dp[100][100],map[100][100];//,direct[4][2];
 
int direct[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
 
void Dp(int x, int y)
{
    int k,xx,yy;
    dp[x][y]=1;
    for(k=0;k<4;k++)
    {
        xx=x+direct[k][0];
        yy=y+direct[k][1];
        if(xx>=0&&xx<m1 && yy>=0&&yy<m2 && 1==map[xx][yy] && 0==dp[xx][yy])
            Dp(xx,yy);
    }
}
 
int Search(int x, int y)
{
    int k,xx,yy;
    if((1==map[x][y]) && (0==dp[x][y]))
    {
        dp[x][y]=1;
        for(k=0;k<4;k++)
        {
            xx=x+direct[k][0];
            yy=y+direct[k][1];
            //yy>=0&&yy<m2 写成了 yy>0&&yy<m2 多浪费了2个小时。。。。。。。
            if(xx>=0&&xx<m1 && yy>=0&&yy<m2 && 1==map[xx][yy] && 0==dp[xx][yy])
                Dp(xx,yy);
        }
        return 1;
    }
    return 0;
}
 
int main()
{
    int n,i,j,count;
    cin>>n;
    while(n--)
    {
        //构建地图
        cin>>m1>>m2;
        for(i=0;i<m1;i++)
            for(j=0;j<m2;j++)
            {
                cin>>map[i][j];
                dp[i][j]=0;
            }
        //找水池
        count=0;
        for(i=0;i<m1;i++)
            for(j=0;j<m2;j++)
                if(Search(i,j))
                    ++count;
        cout<<count<<endl;
                 
    }
    return 0;
}


看过标程之后改的


#include <iostream>
 
using namespace std;
 
int map[102][102];
int direct[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int m1,m2;
 
void Search(int x, int y)
{
    int k,xx,yy;
    for(k=0;k<4;k++)
    {
        xx=x+direct[k][0];
        yy=y+direct[k][1];
        if(xx>=0&&xx<m1 && yy>=0&&yy<m2 && 1==map[xx][yy])
        {
            map[xx][yy]=0;
            Search(xx,yy);
        }
    }
}
 
int main()
{
    int n,i,j,count;
    cin>>n;
    while(n--)
    {
        //构建地图
        cin>>m1>>m2;
        for(i=0;i<m1;i++)
            for(j=0;j<m2;j++)
                cin>>map[i][j];
             
        count=0;
        //找水池
        for(i=0;i<m1;i++)
            for(j=0;j<m2;j++)
            {
                if(map[i][j])
                {
                    count++;
                    map[i][j]=0;
                    Search(i,j);
                }
            }
             
        cout<<count<<endl;             
    }
    return 0;
}


NYOJ 27 水池数目

标签:c++   acm   

原文地址:http://blog.csdn.net/u011694809/article/details/46324449

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!