洛谷 P1443 马的遍历
题目描述
有一个n*m的棋盘(1
#include <iostream>
#include <iomanip>
using namespace std;
int a[1000][1000],b[1000][1000];
int s[1000000][3];
int n,m,x,y;
int dx[9]={0,2,2,-2,-2,-1,-1,1,1};
int dy[9]={0,1,-1,1,-1,2,-2,2,-2};
void init()
{
cin>>n>>m>>x>>y;
return;
}
void bfs()
{
int t,h,i;
t=1;h=0;s[1][1]=x;s[1][2]=y;s[1][3]=0;a[x][y]=0;b[x][y]=1;
do
{
h++;
for (i=1;i<=8;i++)
if (s[h][1]+dx[i]>=1&&s[h][1]+dx[i]<=n&&s[h][2]+dy[i]>=1&&s[h][2]+dy[i]<=m)
if (b[s[h][1]+dx[i]][s[h][2]+dy[i]]==0)
{
t++;
s[t][1]=s[h][1]+dx[i];
s[t][2]=s[h][2]+dy[i];
s[t][3]=s[h][3]+1;
a[s[t][1]][s[t][2]]=s[t][3];
b[s[t][1]][s[t][2]]=1;
}
}
while (h<t);
return;
}
void print()
{
int i,j;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
if (b[i][j]==1) cout<<std::left<<setw(5)<<a[i][j];
else cout<<std::left<<setw(5)<<-1;
cout<<endl;
}
return;
}
int main()
{
init();
bfs();
print();
return(0);
}