P1443 马的遍历
用两个变量,一个步数,一个下一步步数的总数,广搜
注意:数组开大
#include<bits/stdc++.h>
using namespace std;
int dx[10]={-2,-2,-1,-1,2,2,1,1};
int dy[10]={1,-1,2,-2,1,-1,2,-2};
long long bs=1,sss,aaa=1;
long long x1[500][2001],x2[501][2001],s;
long long n,k,m,x,y,a[501][501],i,j;
int main(){
//freopen("ws.out","w",stdout);
cin>>n>>m>>x>>y;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
a[i][j]=-1;
}
}
int falg=1;
a[x][y]=0;
x1[0][1]=x;
x2[0][1]=y;
while(bs>0){
//cout<<s<<" "<<bs<<endl;
sss=bs;
bs=0;
for(j=1;j<=sss;j++){
for(i=0;i<=7;i++){
int xx=x1[s][j]+dx[i];
int yy=x2[s][j]+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==-1){
a[xx][yy]=s+1;
bs=bs+1;
x1[s+1][bs]=dx[i]+x1[s][j];
x2[s+1][bs]=dy[i]+x2[s][j];
// cout<<s+1<<" "<<x1[s][j]<<" "<<x2[s][j]<<" "<<dx[i]+x1[s][j]<<" "<<dy[i]+x2[s][j]<<endl;
}
}
}
/*for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
printf("%-5d",a[i][j]);
}
cout<<endl;
}*/
aaa=aaa+bs;
if(bs<=0){
break;
}
s++;
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
printf("%-5d",a[i][j]);
}
cout<<endl;
}
}
浙公网安备 33010602011771号