题目描述
有一个n*m的棋盘(1
//这是一个简单的dfs做的
#include<iostream>
#include<string.h>//memset要用到
#include<queue>
#include<iomanip>//setw要用到
using namespace std;
bool vis[500][500]; //是否走过
int map[500][500]; //存步数
int n,m,x,y;
int dir[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};//用数组把方向存起来
void dfs(int x,int y,int step){
map[x][y]=step;
vis[x][y]=1;
for(int i=0;i<8;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&(!vis[nx][ny]||map[nx][ny]>step+1))
dfs(nx,ny,step+1);//下面我加了一个else return 结果错误 不清楚为什么
}//别的大牛都是对每一个点进行dfs 没有终止条件
}
int main(){
cin>>n>>m>>x>>y;
memset(map,-1,sizeof(map));
memset(vis,0,sizeof(vis));
dfs(x,y,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cout<<setw(5)<<left<<map[i][j];
cout<<endl;
}
return 0;
}
//这个是模拟队列做的
#include<iostream>
#include<string.h>
#include<iomanip>
using namespace std;
bool vis[500][500]; //是否走过
int map[500][500]; //存步数
int q[200000][4];
int n,m;
int x,y;
int dir[8][2]={{-1,-2},{-1,2},{1,-2},{1,2},{-2,-1},{-2,1},{2,-1},{2,1}};
//走向
int main(){
cin>>n>>m>>q[1][1]>>q[1][2];
memset(map,-1,sizeof(map));
q[1][3]=0;
map[q[1][1]][q[1][2]]=0; //起始的点设为0
int front=1,rear=1;
while(rear>=front){
for(int i=0;i<8;i++){
int nx=q[front][1]+dir[i][0];
int ny=q[front][2]+dir[i][1];
if(nx<1||nx>n||ny<1||ny>m) continue;
if(map[nx][ny]==-1){//如果该地点没有访问过 就将其放上步数
rear++;
q[rear][1]=nx;
q[rear][2]=ny;
q[rear][3]=q[front][3]+1;//到该点的步数
map[nx][ny]=q[rear][3];
}
}
front++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cout<<setw(5)<<left<<map[i][j];
cout<<endl;
}
return 0;
}
/* 扩充知识点 可用队列结构体做 练习可看另一题的这种做法 还使用了hash http://blog.csdn.net/benoble_/article/details/54177251
#include<queue>
struct act{
int q,w; //x y的坐标
}temp;
queue<pair<act,int> > q; //x y坐标 和步数
q.push(make_pair(temp,0)); //放进一个空的
pair<act,int> now=q.front(); //创建一个pair型的变量 方便操作
temp=now.first; //将队列首元素给 now
cout<<temp.q<<" "<<temp.w<<endl;//输出当前 temp的x temp的y
cout<<now.second<<endl; //输出now的步数
*/