題目描述
有一個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的步數
*/