洛谷P1443马的遍历-题解
原题:

思路:
广搜。
但队列除了记忆坐标,还要记忆步数。
在将一个点入队的时候,这个点的步数为这个点的父亲节点的步数+1,顺便把答案设了。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int sx,sy;
int a[405][405];
int book[405][405];
int nxt[8][2]={{-2,1},{-2,-1},{-1,2},{-1,-2},{2,1},{2,-1},{1,2},{1,-2}};
queue<int> qx;
queue<int> qy;
queue<int> qs;
void BFS()
{
while(!qx.empty()&&!qy.empty())
{
for(int i=0;i<8;i++)
{
int tx=qx.front()+nxt[i][0];
int ty=qy.front()+nxt[i][1];
int ts=qs.front()+1;
if(tx<=0||tx>n||ty<=0||ty>m)
continue;
if(book[tx][ty]==1)
continue;
a[tx][ty]=ts;
book[tx][ty]=1;
qx.push(tx);
qy.push(ty);
qs.push(ts);
}
qx.pop();
qy.pop();
qs.pop();
}
}
int main()
{
scanf("%d %d %d %d",&n,&m,&sx,&sy);
qx.push(sx);
qy.push(sy);
qs.push(0);
book[sx][sy]=1;
BFS();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(book[i][j])
printf("%-5d",a[i][j]);
else
printf("%-5d",-1);
printf("\n");
}
return 0;
}
浙公网安备 33010602011771号