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<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m,tx,ty; int ans[410][410],vis[410][410]; int dx[8]={1,1,-1,-1,2,-2,2,-2}; int dy[8]={2,-2,2,-2,1,-1,-1,1}; struct nond{ int x,y,pos; }; int main(){ scanf("%d%d%d%d",&n,&m,&tx,&ty); nond tmp;vis[tx][ty]=1; tmp.x=tx;tmp.y=ty;tmp.pos=0; queue<nond>que; que.push(tmp); while(!que.empty()){ nond now=que.front(); que.pop(); for(int i=0;i<8;i++){ nond c; c.x=dx[i]+now.x; c.y=dy[i]+now.y; c.pos=now.pos+1; if(c.x>=1&&c.x<=n&&c.y>=1&&c.y<=m&&!vis[c.x][c.y]){ ans[c.x][c.y]=c.pos;vis[c.x][c.y]=1; que.push(c); } } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(!vis[i][j]) ans[i][j]=-1; printf("%-5d",ans[i][j]); } cout<<endl; } }