ACM:BFS


注意:为了归纳分类,有些文章的标题中带小括号,小括号里的内容对应于OI Wiki网站中的目录:oi-wiki.org(若小括号中有大于号">“,则表示此文章的内容处于”>"后面的子目录中,或者子目录的子目录中…)


前言

        这里只显示最模板的二维网格题型的板子,一维数轴题型也是这个思路,但题目变化多端,没有板子可言,掌握思路原理即可。剪枝请自行根据题目在适当位置操作,本文不过多叙述。

一、BFS大致思路原理(通用板子)

typedef pair<int, int> pii;

void bfs() {
	queue<pii> q;
	q.push({ , });
	/*标记*/

	while (!q.empty()) {
		int currentx = q.front().first;
		int currenty = q.front().second;
		q.pop();

		/*此处对当前状态进行扩展(新状态为newx,newy)*/

		if (/*判断扩展方式所达到的状态是否合法*/) {
			q.push({ , });
			/*标记*/
		}
	}
}

二、二维网格题型板子

注意:如果是多组输入,一定要记得用memset(visited, false, sizeof(visited))初始化标记数组。

typedef pair<int, int> pii;

int w, h;
char graph[1005][1005];
bool visited[1005][1005];
int startx, starty, targetx, targety;  // 起始状态和目标状态的坐标

int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

void bfs(int startx, int starty) {
    queue<pii> q;
    q.push({startx, starty});
    visited[startx][starty] = true;

    while (!q.empty()) {
        int currentx = q.front().first;
        int currenty = q.front().second;
        q.pop();

        // 到达终点状态(最短路径问题一般要用)
        if (currentx == targetx && currenty == targety) {
            return;
        }

        for (int i = 0; i < 4; ++i) {
            int newx = currentx + dx[i];
            int newy = currenty + dy[i];

            // 判断扩展方式所达到的状态是否合法(这里只是简单示例,可根据题意添加)
            if (newx >= 0 && newx < h && newy >= 0 && newy < w && graph[newx][newy] == '.' && !visited[newx][newy]) {
                q.push({newx, newy});
                visited[newx][newy] = true;
            }
        }
    }
}

结语

我只是一个A C M预习时长两年半的蒟蒻练习生,喜欢暴力,打表,面向样例编程,请各位键盘侠手下留情。
两年半

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-George-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值