sdnu 1027.马踏飞燕(续)

2024-02-21 00:58
文章标签 1027 sdnu 马踏飞

本文主要是介绍sdnu 1027.马踏飞燕(续),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接: http://210.44.14.31/problem/show/1027


考查BFS。


思路:以起点为根,逐渐向外扩展。


关键点:怎样维护你走的第几步。

有两种方法:

1.棋盘int,结点pair:可以用棋盘来维护,

上一步棋盘位置的步数+1=下一步棋盘位置的步数。

2.棋盘bool,结点struct :可以用结点来维护,就像一棵树,起始点是根,

每次BFS便往外扩展一圈,所以child的步数=parent的步数+1。

(struct里面设第三个变量记录步数)


代码如下(第一种方法):

#include<iostream>
#include<queue>
#include<utility>
#include<cstring>
#include<cstdio>
using namespace std;
int qp[2001][2001];
int main()
{int nextx[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };int nexty[8] = {-2,-1, 1, 2,  2,  1, -1, -2 };int x, y, m, n;memset(qp, 0, sizeof(qp));pair<int, int>pa;queue<pair<int, int> >q;scanf_s("%d%d%d%d", &x, &y, &m, &n);pa.first = x; pa.second = y;q.push(pa);while (!q.empty())				{pair<int, int>temp = q.front();q.pop();if (qp[temp.first][temp.second] <= 199)			//200步就不用走了{for (int i = 0; i < 8; i++){pa.first = temp.first + nextx[i]; pa.second = temp.second + nexty[i];if (pa.first >= 0 && pa.first < 2000 && pa.second >= 0 && pa.second < 2000){if (pa.first == m&&pa.second == n)		//找到直接跳出循环goto end;if (qp[pa.first][pa.second] == 0)		//若该点没走过则赋值{qp[pa.first][pa.second] = qp[temp.first][temp.second] + 1;q.push(pa);}}}}		}cout << "N" << endl;return 0;
end: cout << "Y" << endl;return 0;
}


这篇关于sdnu 1027.马踏飞燕(续)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730105

相关文章

JD 1027:欧拉回路

OJ题目:click here~~ 题目分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路。 具有欧拉路径的图称为欧拉图(简称E图)。 无向图存在欧拉回路的充要条件: 一个无向图存在欧拉回路,当且仅当该图拥有奇数度数的顶点的个数为0且该图是连通图。 有向图存在欧拉回路的充要条件: 一

【ACM】----SDNU-OJ 1206

1. 问题描述 1206.蚂蚁感冒 Time Limit: 1000 MS    Memory Limit: 32768 KB Total Submission(s): 18    Accepted Submission(s): 3 Description 长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当

(hdu)1027 全排序

调用STL库函数next_permutation(startAddress,endAddress)     #include"stdio.h"#include"algorithm"using namespace std;int main(){int n,m,i;int a[20000];while(scanf("%d%d",&n,&m)!=EOF){for(i=0;i<

LIGHTOJ 1027(概率 - 期望)

/*题意:一个迷宫有n扇门,每次你可以任意选一扇门,每一扇门都有一个值xi如果xi > 0 ,表示可以走出迷宫,走出迷宫需要的时间为xi; 否则 回到原来的位置,用了xi的时间;问你走出迷宫所需时间的期望值题解:设有k个门可以走出迷宫,一次走出迷宫的概率为k/n,期望次数为n/k;走一次迷宫的平均时间为 sum/n;则走出迷宫的时间期望为 sum/n * n/k;*/#include<stdi

力扣 1027. 最长等差数列 python AC

动态规划 class Solution:def longestArithSeqLength(self, nums):size = len(nums)maxv = 0dp = [[1] * 1001 for _ in range(size)]for i in range(size):for j in range(i):d = nums[j] - nums[i] + 500dp[i][d] = ma

九度oj 题目1027:欧拉回路 【ZJU2008考研机试题2】

题目1027:欧拉回路 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2021 解决:974 题目描述: 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路? 输入: 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后

九度1027 - 数学 - 欧拉回路

欧拉回路是指每条边恰好只走一次,并能回到出发点的路径。 我们如何判断一个图有欧拉回路? 一、无向图 每个顶点的度数都是偶数,则存在欧拉回路。 二、有向图(所有边都是单向的) 每个节顶点的入度都等于出度,则存在欧拉回路。 知道了这些,我们只要判断每个边的度数即可。 #include<stdio.h>#include<string.h>int du[1010];int ma

杭电OJ 1027:Ignatius and the Princess II

题目的大意就是求一串数字的全排列的第m小的排列,比如1,2,3是3个数的最小的全排列,1,3,2是次小的全排列。这个题目可以用STL的一个函数next_permutation,这个函数是用来生成一个全排列的下一个全排列,当然也可以自己写生成排列算法,生成一个全排列的下一个全排列的算法如下: (1)从数组最后一个开始往前找,假设后一个记为p,前一个记为pre,直到找到一个满足A[pre]<A[p]

【C++题解】1027 - 求任意三位数各个数位上数字的和

问题:1027 - 求任意三位数各个数位上数字的和 类型:基础问题 题目描述: 对于一个任意的三位自然数 x ,编程计算其各个数位上的数字之和 S 。 输入: 输入一行,只有一个整数 x(100≤x≤999) 。 输出: 输出只有一行,包括 1 个整数。 样例: 输入: 123 输出: 6 完整代码如下: #include<iostream> usin

1027:输出浮点数--信息学一本通(c++)

NOIP信息学奥赛资料下载 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 16960 通过数: 10905 【题目描述】 读入一个双精度浮点数,分别按输出格式“%f”,“%f”保留5位小数,“%e”和“%g”的形式输出这个整数,每次在单独一行上输出。 【输入】 一个双精度浮点数。 【输出】 第一行是按“%f”输出的双精度浮点数; 第二行是按“%f”保留5位小数输出的双精