P1443 马的遍历

P1443 马的遍历

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

3 3 1 1

输出样例#1:

0    3    2
3    -1   1
2    1    4    
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>

using namespace std;
const int N=401;
const int xd[]={-1,-2,-2,-1,1,2,2,1};
const int yd[]={-2,-1,1,2,2,1,-1,-2};

struct node{
    int x,y,step;
}now,top,nxt;
queue<node>q;
int ans[N][N];
int n,m,startx,starty;

inline int read()
{
    int x=0;char c=getchar();
    while(c<‘0‘||c>‘9‘)c=getchar();
    while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();
    return x;
}

inline void bfs(int x,int y)
{
    ans[x][y]=-3;
    now.x=x;
    now.y=y;
    now.step=0;
    q.push(now);
    while(!q.empty())
    {
        top=q.front();
        q.pop();
        for(int i=0;i<8;i++)
        {
            int x=top.x+xd[i];
            int y=top.y+yd[i];
            if(x>0&&x<=n&&y>0&&y<=m&&!ans[x][y])
            {
                ans[x][y]=top.step+1;
                nxt.x=x;
                nxt.y=y;
                nxt.step=top.step+1;
                q.push(nxt);
            }
        }
    }
}

int main()
{
    n=read();
    m=read();
    startx=read();
    starty=read();
    bfs(startx,starty);

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(ans[i][j]==-3)
                printf("%-5d",0);
            else if(ans[i][j]==0)
                printf("%-5d",-1);
            else printf("%-5d",ans[i][j]);
        }
        printf("\n");
    }    

    return 0;
}
				
时间: 2024-10-25 02:38:26

P1443 马的遍历的相关文章

洛谷 P1443 马的遍历

题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 3 3 1 1 输出样例#1: 0 3 2 3 -1 1 2 1 4 代碼實現: #include<cstdio>#include<iostream>using

洛谷——P1443 马的遍历

https://www.luogu.org/problem/show?pid=1443#sub 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 3 3 1 1 输出样例#1: 0 3 2 3 -1 1 2 1 4 1 #include

马的遍历问题

题意例如以下: 马的遍历问题.设计程序完毕例如以下要求: 在中国象棋棋盘上,对任一位置上放置的一个"马". 均能选择一个合适的路线,使得该棋子能按象棋的规则 不反复地走过棋盘上的每一位置. 思路:这是一个DFS搜索,然后没有使用另外的数组来标记某一位置是否已经被走过,而是直接使用存步数的数组num[][]来作为标记数组! 然后我使用了两个数组作为方向坐标,以便能让马移动,同一时候也能记录马所在位置的坐标!(马是能够从8个移动方向中选择的!) 代码还是非常好理解的! 至于棋盘的规格能够自

马的遍历

题目链接 首先,这是一道水题.(虽然我提交了四次才A掉) 思路是很简单的.马的遍历,经典中的经典,一想就是搜索.但流传较广的是DFS,第一直觉也是DFS.可是,一看题,求马到各点的最短路,是求最优解,且是各个点,自然想到了BFS. BFS的简单思路,将矩阵每个点 原文地址:https://www.cnblogs.com/qing1/p/11066106.html

马的遍历——搜索与回溯

题目描述 Description 中国象棋半张棋盘如图所示.马自左下角往右上角跳.今规定只许往右跳,不许往左跳.比如图4(a)中所示为一种跳行路线,并将所经路线打印出来. 输入输出格式 Input/output 输入格式:无输出格式: 第一行:一个整数total表示第几种跳法 第二行:0,0-->2,1-->3,3-->1,4-->3,5-->2,7-->4,8 输入输出样例 Sample input/output 样例测试点#1 输入样例: 无 输出样例: 1 0,0

1443 马的遍历

难度:普及/提高- 题目类型:BFS 提交次数:5 涉及知识:BFS 题目描述 有一个n*m的棋盘(1<n,m<=200),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 代码: #include<iostream> #include<queue> #include<cstring>

Ka的回溯编程练习 Part5|跳马,又名马的遍历2

1 #include <stdio.h> 2 int TheEarthLand[6][6]={0}; 3 int HowToGoX[]={0,1,2,2,1,-1,-2,-2,-1}; 4 int HowToGoY[]={0,-2,-1,1,2,2,1,-1,-2}; 5 int total=0; 6 void op() 7 { 8 total++; 9 printf("<Way%d>:\n",total); 10 int i,j; 11 for(i=1;i&l

马的遍历(BFS

https://www.luogu.org/problemnew/show/P1443 模板BFS...... 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<string> 7 #include<cmath> 8 #include<set>

广搜模板题马的遍历题解

题目描述 有一个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]