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的步数

    */

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