nyoj27水池数目VSnyoj58最小步数(DFS)

水池数目

时间限制: 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<stdio.h>
int a[200][200];
int dx[4]={0,0,1,-1};//方向数组 
int dy[4]={1,-1,0,0};
void bfs(int x,int y)
{
	a[x][y]=0;//水池要马上变成陆地防止无限进入函数 
	for(int k=0;k<4;k++)
	{
		int sx=x+dx[k];//任意一个这个点的上下左右 
		int sy=y+dy[k];
		if(a[sx][sy]==1)//如果又是水池再次进入函数 
		bfs(sx,sy);
	}
	
}
int main()
{
	int T,j,i,n,m,count;
	scanf("%d",&T);
	while(T--)
	{
		count=0;
		scanf("%d %d",&m,&n);//m行n列 
		for(i=1;i<=m;i++)
		{
		for(j=1;j<=n;j++)
		{
			scanf("%d",&a[i][j]);//输入水池分布情况1为有水池,0为没有水池 
		}	
		}
		for(i=1;i<=m;i++)
		{
			for(j=1;j<=n;j++)
			{
				if(a[i][j]==1)
				{
				bfs(i,j);//如果有水池看看周边有没有水池这样可以算成一个大水池 
				count++;//判断结束后跳出最后一层函数,已经知道大水池有几个小水池构成,要输出水池数目,所以要自增 
				}
			}
		}
		printf("%d\n",count);
	}
	return 0;
}

最少步数

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 4
描述

这有一个迷宫,有0~8行和0~8列:

 1,1,1,1,1,1,1,1,1  1,0,0,1,0,0,1,0,1  1,0,0,1,1,0,0,0,1  1,0,1,0,1,1,0,1,1  1,0,0,0,0,1,0,0,1  1,1,0,1,0,1,0,0,1  1,1,0,1,0,1,0,0,1  1,1,0,1,0,0,0,0,1  1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?

(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据; 随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
2
3 1  5 7
3 1  6 7
样例输出
12
11
#include<stdio.h>
#define INF 0xfffffff//最大值一个零一个x七个f 
int dx[4]={0,0,1,-1};// 以进入函数的点为零点 ,四个方向 上下左右 
int dy[4]={1,-1,0,0};//
int ex,ey,x,y,min,c;
int map[9][9]={//二维数组记录迷宫的情况 
 1,1,1,1,1,1,1,1,1,
 1,0,0,1,0,0,1,0,1,
 1,0,0,1,1,0,0,0,1,
 1,0,1,0,1,1,0,1,1,
 1,0,0,0,0,1,0,0,1,
 1,1,0,1,0,1,0,0,1,
 1,1,0,1,0,1,0,0,1,
 1,1,0,1,0,0,0,0,1,
 1,1,1,1,1,1,1,1,1,
};
void dfs(int x,int y,int c)
{
	int i,s,t;
	if(x==ex&&y==ey&&c<min)
	{
		min=c;
	}
	for(i=0;i<4;i++)
	{
		int s=x+dx[i];//任意一个这个点的上下左右 
		int t=y+dy[i];
		if(map[s][t]==0&&c+1<min)//判断是否是通路 
		{
			map[s][t]=1;//如果是通路步数加1立马给封死, 
			dfs(s,t,c+1);//进入下一步,如果是通路继续判断下下一步而且要步数加1,如果碰到的是墙要跳出函数执行下一步 
			map[s][t]=0;//要把以前的断路重新变成通路才好改变方向继续走 
		}
		
	}
}
int main()
{
	int T,i,j;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d %d %d %d",&x,&y,&ex,&ey);
		min=INF;//把最小值设成无限大 
		map[x][y]=1;//从起点开始就要把起点的0改成1,就是防止一直进入dfs 
		c=0;//记录步数 
		dfs(x,y,c);//进入dfs函数 
		map[x][y]=0;//如果从一开始就碰壁,那么就从一开始改变方向 
		printf("%d\n",min);	
	}	
	return 0;
}


你可能感兴趣的:(nyoj27水池数目VSnyoj58最小步数(DFS))