广搜模板题马的遍历题解

题目描述

有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

输入格式

一行四个数据,棋盘的大小和马的坐标

输出格式

一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

本题思路是利用队列存储,将当前点可到达的下一个点入队以保证步数最小

#include<bits/stdc++.h>
using namespace std;
int n;
int a,b,c,d,k[1001][1001];
int e[8]={1,2,2,1,-1,-2,-2,-1};//行行走
int f[8]={2,1,-1,-2,-2,-1,1,2};//列行走
queue <int> p;//行队列(STL大法好啊)
queue <int> q;//列队列
void bfs()
{
    p.push(c);
    q.push(d);
    k[c][d]=0;
    while(!q.empty()&&!p.empty())
    {
        int o=p.front();
        int w=q.front();
        for(int i=0;i<=7;i++)//向八个方向试探
        if(o+e[i]>=1&&o+e[i]<=a&&w+f[i]>=1&&w+f[i]<=b&&k[o+e[i]][w+f[i]]==-1)
        {k[o+e[i]][w+f[i]]=k[o][w]+1;//运用队列保证步数最小
        p.push(o+e[i]);
        q.push(w+f[i]);}
        q.pop();
        p.pop();
    }
}
int main()
{
    cin>>a>>b>>c>>d;
    memset(k,-1,sizeof(k));//不能到达就输出-1
    bfs();
    for(int i=1;i<=a;i++)
    {for(int j=1;j<=b;j++)
    printf("%-5d",k[i][j]);//输出格式(左对齐5格,第一次就是被这个坑了)
    cout<<endl;}
    return 0;
}

原文地址:https://www.cnblogs.com/ln1225/p/11371406.html

时间: 2024-10-08 21:48:47

广搜模板题马的遍历题解的相关文章

杭电 1372 Knight Moves(广搜模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6439    Accepted Submission(s): 3886 Problem Description A friend of you is doing res

一道广搜寻路题

同样是在qq群里看到的题目,想了好久算法,实现也用了很久. 关于题目首先看图: 总的来说,就是一个二维迷宫的寻路,迷宫中有对应的钥匙和刺,每走一步会消耗1点Hp,当走到刺上时会额外消耗100点hp,持有对应颜色的钥匙通过刺时不用额外消耗Hp. 给予起点和终点的坐标,,输出移动方式,让人物抵达终点所消耗的Hp尽可能的小. 例子: 3 3 1..a##A...1 13 3这个是输入数据 第一个代表高 第二个宽 第三个是钥匙和陷阱的对数 .代表平地 #代表墙 小写字母是钥匙 大写字母是对应的陷阱输出为

HDU - 1010 Tempter of the Bone 深搜模板题(DPS)解题报告

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 88587    Accepted Submission(s): 24116 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

广搜简单题

Catch That Cow 题目传送:POJ - 3278 - Catch That Cow 题解:点击即传送 迷宫问题 题目传送:POJ - 3984 - 迷宫问题 DFS也可以,见另一个题解 AC代码(BFS): #include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include &l

hdu 1180(广搜好题)

诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 12487    Accepted Submission(s): 3120 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比 如下面的例子里,一开始楼梯在

图的广搜与深搜模板

题目传送门 深搜 深搜,顾名思义就是往深了搜.每次,只要你发现下一个点可以走,你马上走上去 就行啦!!就这样不断递归,直到遇到你的边界条件,撞到了南墙,你再也走不下去了,哼哼,我回头退回去!! 可以跟大家看下样例::(自己去题面看图) 样例是从1出发,先走2,然后走5,发现走不下去,退回来. 站在2这里,我们又往6走,发现又走不下去了,退回2.此时2没有点可走,退回1,去往3. 在3点,我们前往7,然后再往8,无路可走,退回7->3——>1.最后走4. 广搜和深搜略有不同. 广搜就是先站在目前

poj 3984:迷宫问题(广搜,入门题)

迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利

poj1426--Find The Multiple(广搜,智商题)

Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18527   Accepted: 7490   Special Judge Description Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains