codeforces A. Ice Skating(DFS)

题意

Bajtek是个滑冰的初学者,只能通过进行东南西北的滑行,现在有N堆雪堆,分别处于不同的坐标位置,问至少需要增加多少堆雪堆才能在所有的雪堆上滑行?

思路

仔细想想能发现这是类似于Lake Counting的题意的题,通过深度搜索到每一个能到达的雪堆为一可行的路径,在所给出的所有坐标里一共可以分成假设为是 N 条的路径,而这N条路径最少需要N-1个雪堆连接起来,这样就得到了解;在写dfs函数时要注意条件和逻辑。在dfs函数里不能图快直接写 maze[i][0]==maze[i][1]==0 ,应该写成这种形式maze[i][0]==0 && maze[i][1]==0。

code

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

int n;
int a[150][2];     //雪堆坐标
int maze[150][2];  //判断数组

int dfs(int l)
{
	maze[l][0]=maze[l][1]=1; //变化为1 表示在这条路径上来过
	
	for(int i=0;i<n;i++)
	{
		if( (a[i][0]==a[l][0] || a[i][1]==a[l][1]) && maze[i][0]==0 && maze[i][1]==0 )
		{
			dfs(i);
		}
	}
}

int main()
{	
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d%d",&a[i][0],&a[i][1]);
		}
		
		memset(maze,0,sizeof(maze));
		int res=0;
		
		for(int i=0;i<n;i++)
		{
			if(maze[i][0]==0 && maze[i][1]==0)
			{
				dfs(i);
				res++;
			}
		}
		
		printf("%d\n",res-1); // 需要N-1个雪堆
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LaoXiangQ/article/details/84844611