STL应用:queue习题POJ-1915

题目:1915 -- Knight Moves (poj.org)

此题想要求掌握利用队列进行广度优先搜索的能力。另外也有一定的动态规划思想。

在做的过程中有几点需要注意(出错点):

 1:如果初始点等于终止点则立刻跳出。

2:在BFS过程中要避免对已经搜索过的点进行二次搜索

3:由一个点搜索出的其他点位应该在步数上加1(类似于DP)

4:搜索出的点位不能越界

代码:

注:此代码还具备储存所有合法点位最小步数的功能

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
typedef struct st {
	int row;
	int col;
}S;
int num[305][305];
int move1[8][2] = { 1,2,2,1,-1,2,-2,1,-1,-2,-2,-1,1,-2,2,-1 };		//八组偏移量
queue<S> s1;
int start_row, start_col, end_row, end_col;
int l;

int main() {
	int n;
	cin >> n;
	while (n--) {
		for (int i = 0; i < 305; i++)memset(num[i], -1, sizeof(num[0]));	//初始化,使-1作为是否搜索过的条件
		cin >> l >> start_row >> start_col >> end_row >> end_col;
		//BFS
		S s;
		s.row = start_row, s.col = start_col;
		num[s.row][s.col] = 0;
		s1.push(s);
		while (!s1.empty()) {
			s.row = s1.front().row;
			s.col = s1.front().col;
			s1.pop();
			if (start_row == end_row && start_col == end_col)break;
			for (int i = 0; i < 8; i++) {
				if (s.row + move1[i][0] >= 0 && s.row + move1[i][0] < l && s.col + move1[i][1]>=0 && s.col + move1[i][1] < l&&num[s.row + move1[i][0]][s.col + move1[i][1]]==-1) {	//判断是否越界和是否已经搜索过
					S ss;
					ss.row = s.row + move1[i][0];
					ss.col = s.col + move1[i][1];
					num[ss.row][ss.col] = num[s.row][s.col] + 1;
					s1.push(ss);
				}
			}
		}
		cout << num[end_row][end_col] << endl;		//输出需要点位的步数
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淬炼之火

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

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

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

打赏作者

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

抵扣说明:

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

余额充值