Red and Black (2018 暑期多校联赛,万恶的搜索)

        曾经有一个伟大的博主,

        他说过这么一句话:

        “搜索就是优雅地暴力”。

        今儿我们继续暴力暴力...

        OVO好了,我们一如既往地放上泥萌期待的链接:杭电1312 Red and black

        这道题目其实还是深度搜索辣,不过这次的深搜有些特别,记得之前是POJ还是再HPU的VJ上见过一个之类的题目,是踩水坑的,就是让你找出上下左右相连的连成片的水坑有几个,我们这里如果按照水坑这么理解就是,看这个水坑的面积有多大。

        题目泥萌能看懂的,就是看这个人能踩多少块砖(也许他喜欢玩玛丽奥),然后这个就是深搜一下,从他的起点开始去搜索,规则如下:

  1.         找出起点,放入待判队列。
  2.         取出待判队列的一个点,对它上下左右四个点进行判断,看能不能走,能的放入待判队列。
  3.         本次取点弹出,结果加一。
  4.         重复2,3,直到待判队列为空。

        是不是很简单!OVO

        然后就是按照这个路子走,详细的东西注意一下就可以辣~

        又到了泥萌最喜欢的代码了~

#include
#include
using namespace std;

int col, row;

struct Node
{
	int row, col;
	char c;
}dis[30][30], temp;//点结构体,row和col分别储存本点坐标,c表示这一点状态

queue s;//待判队列
int dir[][2] = { 1,0,-1,0,0,1,0,-1 };//这个骚气的数组用来计算一个点的四周的点的坐标
int ans;//这个不解释,但是我还要加一行注释来凑八百字!

int main()
{
	while (scanf("%d %d", &col, &row) != EOF && (col || row))
	{
		ans = 0;
		for (int i = 0; i < row; i++)
		{
			getchar();
			for (int j = 0; j < col; j++)
			{
				scanf("%c", &dis[i][j].c);
				dis[i][j].row = i;
				dis[i][j].col = j;
				if (dis[i][j].c == '@')//找到起点就可以进入待判队列辣
				{
					s.push(dis[i][j]);
				}
			}
		}
		while (!s.empty())//下面就是深搜的老套路了,合适的点进,出来的点就算走过,标记一下就行辣
		{
			temp = s.front();
			s.pop();
			ans++;
			for (int i = 0; i < 4; i++)
			{
				if (dis[temp.row + dir[i][0]][temp.col + dir[i][1]].c == '.'&&temp.row + dir[i][0] >= 0 && temp.row + dir[i][0] < row&&temp.col + dir[i][1] >= 0 && temp.col + dir[i][1] < col)
				{
					s.push(dis[temp.row + dir[i][0]][temp.col + dir[i][1]]);
					dis[temp.row + dir[i][0]][temp.col + dir[i][1]].c = '#';
				}
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

        喜欢记得关注点赞一条龙啊~

你可能感兴趣的:(ACM,题解)