2019省赛A组第4题

题目

 

 代码

BFS

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x;
    int y;
    string p;  //path,记录从起点(0,0)到这个点(x,y)的完整路径
};
char a[31][51];  //存地图

char k[4]={'D','L','R','U'};
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};//x+1往下走,y+1往右走注意!!!
int vis[30][50];  //标记。vis=1: 已经搜过,不用再搜
void input()
{
    ifstream infile;
    infile.open("input.txt");
    for(int i=0;i<30;i++){
        for(int j=0;j<50;j++){
            infile>>a[i][j];
        }
    }
}

void bfs(){
    node start; start.x=0;  start.y=0;   start.p="";  //定义起点
    vis[0][0]=1;              //标记起点被搜过

    queue<node>q;   q.push(start);   //把第一个点放进队列,开始BFS
    while(!q.empty()){
        node now = q.front();  //取出队首
        q.pop();
        /*由于是BFS,广搜,那么层数相当于步数,在同一层,靠左的就是字典序最小*/
        if(now.x==29 && now.y==49){ //第一次达到终点,这就是字典序最小的最短路径
            cout<<now.p<<endl;       //打印路径:从(0,0)到(29,49)
            return;
        }
        for(int i=0;i<4;i++){  //扩散邻居结点
            node next;
            next.x = now.x+dir[i][0];
            next.y = now.y+dir[i][1];
            if(next.x<0||next.x>=30||next.y<0||next.y>=50)  //越界了
                continue;
            if(vis[next.x][next.y]==1||a[next.x][next.y]=='1')  //vis=1:已经搜过;  a=1:是障碍
                continue;
            vis[next.x][next.y]=1;  //标记被搜过
            next.p = now.p+k[i];  //记录完整路径:把上一个点的路径,加上这一步后,复制给下一个点
            q.push(next);
        }
    }
}
int main(){
    input(); //读题目给的地图数据
    bfs();
}

 DFS(未成功)

#include<bits/stdc++.h>
using namespace std;
int row=30,col=50;
int min_step=INT_MAX;
string min_path="";
char maps[30][50];
bool vis[30][50];
int dir[4][2]={
    {1,0},
    {0,-1},
    {0,1},
    {-1,0}
};//x+1往下走,y+1往右走注意!!!
char dir_c[4]={'D','L','R','U'};
void input()
{
    ifstream infile;
    infile.open("input.txt");
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            infile>>maps[i][j];
            vis[i][j]=true;
        }
    }
}

bool check(int x,int y)
{
    return x<row&&x>=0&&y>=0&&y<col&&vis[x][y]&&(maps[x][y]=='0');
}

void dfs(int x,int y,int step,string path)
{
    if(x==row-1&&y==col-1){
        if(step<min_step){
            min_step=step;
            min_path=path;
        }
        return;
    }
    vis[x][y]=false;
    for(int i=0;i<4;i++){
        int next_x=x+dir[i][0];
        int next_y=y+dir[i][1];
        if(check(next_x,next_y)){
            dfs(next_x,next_y,step+1,path+dir_c[i]);
        }
    }
    return;
}
void print()
{
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            cout<<maps[i][j]<<" ";
        }
        cout<<endl;
    }
}
int main()
{
    input();
    dfs(0,0,0,"");
    cout<<min_path;
    //print();
    return 0;
}

 

posted @ 2021-04-13 19:47  南理工学渣  阅读(37)  评论(0)    收藏  举报