洛谷p1443 马的遍历

来源:互联网 发布:百姓自动发帖软件 编辑:程序博客网 时间:2024/05/29 19:41

BFS 就是移动方式改了一下 和走迷宫一样
还能更优的应该

题目描述有一个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<bits/stdc++.h>using namespace std;struct point{    int x,y,s;};int vis[401][401]={0},a[401][401]={0};queue<point> q;int n,m;int main(){    int sx,sy;    scanf("%d%d%d%d",&n,&m,&sx,&sy);    int next[8][2]={{-2,-1},{-1,-2},    {-2,1},{-1,2},    {2,1},{1,2},    {2,-1},{1,-2}    };    point t;    t.x=sx,t.y=sy;    a[sx][sy]=0;    vis[sx][sy]=1;    q.push(t);    while(!q.empty()){        point u=q.front();q.pop();        point tp;        for(int i=0;i<8;i++)        {            tp.x=u.x+next[i][0],tp.y=u.y+next[i][1];            tp.s=a[u.x][u.y]+1;             if(tp.x<1||tp.x>n||tp.y<1||tp.y>m) continue;            if(!vis[tp.x][tp.y])   //如果未访问过             {                a[tp.x][tp.y]=tp.s;                vis[tp.x][tp.y]=1;                q.push(tp);            }        }    }    for(int i=1;i<=n;i++){         for(int j=1;j<=m;j++)            {                if(vis[i][j])printf("%-5d",a[i][j]);                else printf("%-5d",-1);         }    printf("\n");    }    return 0;}
原创粉丝点击