dfs,bfs学习

其实昨天到今天就弄了两个题目,一个是填颜色,一个是拯救总部。

昨天我在写填颜色的时候用的好像不是bfs,我自己看不出来那个程序哪里运用了bfs。但是今天先将一些编译错误找出来了,保证至少有例子输入进去能够得到正确的结果。但是只有48分,目前不知道出错的原因,我下载了样例,打算早起研究。

然后是拯救总部这道题,运用的是dfs,这道题的思路还是能够明白的,没有第一天去了解bfs那么迷茫,代码也敲出来了。但是还没有调试,打算早起调试,并且总结一下,整理一下思路。

下面我将填颜色和拯救总部的代码分别贴出来,记录一下,方便以后纠错和复习吧。


填颜色:(这是第一次代码更改之后的情况,部分例子没法正常输出)

#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);//图的大小
	int map[33][33];
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			scanf("%d", &map[i][j]);
			if (map[i][j] == 0)
			{
				map[i][j] = 2;//先假设将所有等于0的地方涂为2,之后再找出边界外的2改为0
			}
		}
	}
	for (int i = 1; i <= n; i++)//将所有边界的2都可以置为0
	{
		if(map[1][i]==2) map[1][i] = 0;
		if(map[n][i]==2) map[n][i] = 0;
		if(map[i][1]==2) map[i][1] = 0;
		if(map[i][n]==2) map[1][n] = 0;
	}
	for (int i = 0; i <= n; i++)//将图扩大一圈
	{
		map[0][i] = 9;
		map[i][0] = 9;
		map[n+1][i] = 9;
		map[i][n+1] = 9;
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (map[i][j] != 1)
			{
				if (map[i - 1][j] == 0 || map[i + 1][j] == 0 || map[i][j + 1] == 0 || map[i][j - 1] == 0)
				{
					map[i][j] = 0;
				}
			}
			
		}
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			printf("%d ", map[i][j]);
		}
		printf("\n");
	}
	return 0;
}

拯救总部:(题目不贴了,因为只是一个记录贴,之后总结的时候再写详细内容吧)

#include<stdio.h>

int up[5] = { 0,1,-1,0,0 };//方向数组
int down[5] = { 0,0,0,1,-1 };
int x = 0;
int y = 0;
void search(int arr[][]; int m; int n)
{
	int xx = 0;
	int yy = 0;
	arr[m][n] = 1;//该位置在之前已判断为淹没点,所以设置为1,标记
	for (int i = 1; i <= 4; i++)//得到其上下左右位置的坐标
	{
		xx = m + up[i];
		yy = n + down[i];
		if (xx>0&&xx<=x&&yy>0&&yy<=y&&arr[xx][yy] == 0)
			search(arr, xx, yy);
	}
}



int main()
{
	char k;
	int s = 0;
	int arr[502][502];
	scanf("%d", &x);
	scanf("%d", &y);
	for (int i = 1; i <= x; i++)//处理图
	{
		for (int j = 1; j <= y; j++)
		{
			scanf("%c", &k);
			if (k == '*')
				arr[i][j] = 1;
			else
				arr[i][j] = 0;
		}
	}
	for (int i = 1; i <= y; i++)//查第一行和最后一行
	{
		if (arr[1][i] == 0)//第一行
			search(arr,1,i);
		if (arr[x][i] == 0)//最后一行
			search(arr,x,i);
	}
	for (int i = 1; i <= x; i++)//查第一列和最后一列
	{
		if (arr[i][1] == 0)
			search(arr, i, 1);
		if (arr[i][y] == 0)
			search(arr, i, y);
	}
	for (int i = 1; i <= x; i++)
	{
		for (int j = 1; j <= y; j++)
		{
			if (arr[i][j] == 0)
				s++;
		}
	}
	printf("%d", s);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值