luogu P1443 馬的遍歷 【隊列 dfs】

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

    */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章