NYoj-27-水池数目-DFS-BFS

水池数目

时间限制: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
DFS:
#include<cstdio>
#include<cstring>
#define N 200
#define M 200
int map[N][M] = {0};
void DFS(int i,int j)
{
    if(map[i][j-1]) { map[i][j-1]=0; DFS(i,j-1); }
    if(map[i][j+1]) { map[i][j+1]=0; DFS(i,j+1); }
    if(map[i-1][j]) { map[i-1][j]=0; DFS(i-1,j); }
    if(map[i+1][j]) { map[i+1][j]=0; DFS(i+1,j); }
}
int main()
{
     int t,n,m;
     int i,j,count;
     scanf("%d",&t);
     while(t--)
     {
         scanf("%d %d",&n,&m);
         count=0;
         for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                 scanf("%d",&map[i][j]);
         for(i=1;i<=n;i++)
             for(j=1;j<=m;j++)
                 if(map[i][j])
                {
                    count++;
                    map[i][j]=0;
                    DFS(i,j);
                }
         printf("%d\n",count);
     }
return 0;
}  

再看这个:

#include<cstdio>
#include<cstring>
#define N 200
#define M 200
int map[N][M] = {0};
int f[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
void DFS(int i,int j)
{
	int k;
	map[i][j]=0;
	for(k=0;k<4;k++)
	{
		if(map[i+f[k][0]][j+f[k][1]]==1)
		   DFS(i+f[k][0],j+f[k][1]);
	}
}
int main()
{
     int t,n,m;
     int i,j,count;
     scanf("%d",&t);
     while(t--)
     {
         scanf("%d %d",&n,&m);
         count=0;
         for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                 scanf("%d",&map[i][j]);
         for(i=1;i<=n;i++)
             for(j=1;j<=m;j++)
                 if(map[i][j])
                {
                    count++;
                    map[i][j]=0;
                    DFS(i,j);
                }
         printf("%d\n",count);
     }
return 0;
}

BFS:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define N 200
#define M 200
using namespace std;
int map[N][M] = {0};
int f[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
struct pool
{
	int a,b;
};
queue<pool> v;
void BFS(int i,int j)
{
	int k;
	pool p,x,y;
	p.a=i;
	p.b=j;
	v.push(p);
	map[i][j]=0;
	while(!v.empty())
	{
		x=v.front();
		for(k=0;k<4;k++)
		{
			if(map[x.a+f[k][0]][x.b+f[k][1]])
			{
				map[x.a+f[k][0]][x.b+f[k][1]]=0;
				y.a=x.a+f[k][0];
				y.b=x.b+f[k][1];
				v.push(y);
			}
		}
		v.pop();
	}
}
int main()
{
     int t,n,m;
     int i,j,count;
     scanf("%d",&t);
     while(t--)
     {
         scanf("%d %d",&n,&m);
         count=0;
         for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                 scanf("%d",&map[i][j]);
         for(i=1;i<=n;i++)
             for(j=1;j<=m;j++)
                 if(map[i][j])
                {
                    count++;
                    map[i][j]=0;
                    BFS(i,j);
                }
         printf("%d\n",count);
     }
return 0;
}  

  

时间: 2024-12-17 22:00:48

NYoj-27-水池数目-DFS-BFS的相关文章

深搜 ,广搜,队列 nyoj 27 水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水

nyoj 27水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池

NYOJ 27 水池数目 【简单搜索】

链接:click here~~ 题意: 水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个

NYOJ27.水池数目-DFS求连通块

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池

NYOJ题目27水池数目

--------------------------------------------- 这道题有点坑,也怪我总是有点马虎,按照正常人的思维0是表示有水池啊竟然是1表示有水池,最坑的是写反了竟然还能过样例一直以为是自己程序问题review了好多遍.... 图论基础题,染色法即可. AC代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new

nyoj27水池数目 (DFS)

题目27 题目信息 运行结果 本题排行 讨论区 水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行

水池数目(nyoj27)(BFS)

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水

NYOJ 284 坦克大战 【BFS】+【优先队列】

坦克大战 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that co

ACM 水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池

【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因为广搜需要的就是队列,所以相比递归队列更耗内存? 当然DFS并不像上图所说,需要用栈,而是运用递归即可. BFS: 因为BFS是要一个接一个的遍历,所以用到了结构体,来保存坐标和当前所走步数 1.每走一步,通过定义的结构体,从队列中提取a(即上一步的坐标.步数(步数每次累加)) 2.在a的基础上进行