算法提高 学霸的迷宫

记录路径问题和层数利用结构体变量可以很容易的实现 这里要求路劲字典序列最小 改变一下优先的方向就可以了(注意实际方向和二维数组的对应关系,坑死我了),还有就是vis数组,,居然忘记了,活该超时。

太久没写,细节没处理好,,交了几发wa 加油加油。。

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
    int ret,x,y;
    string line;// 记录路劲
};
int n,m;
int mapp[501][501],vis[501][501];
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};// 注意实际方向和坐标的区别
string root="DLRU";
int check(int x,int y)
{
    if(mapp[x][y]==1) return 0;
    if(x<1||x>n||y<1||y>m) return 0;
    return 1;
}
void dfs()
{
    node temp;
    temp.ret=0;
    temp.x=temp.y=1;
    temp.line+='@';
    memset(vis,0,sizeof(vis));
    vis[1][1]=1;
    queue<node> que;
    que.push(temp);
    while(!que.empty())
    {
        node now=que.front();
        que.pop();
        if(now.x==n&&now.y==m)
        {
            cout<<now.line.size()-1<<endl;
            for(int i=1;i<now.line.size();i++) cout<<now.line[i];
            cout<<endl;
            return;
        }
        for(int i=0;i<4;i++)
        {
            int xx=now.x+dir[i][0];
            int yy=now.y+dir[i][1];
            if(check(xx,yy)&&!vis[xx][yy])
            {
                vis[xx][yy]=1;
                node temp;
                temp.x=xx;
                temp.y=yy;
                //temp.ret=++now.ret;
                temp.line+=now.line;
                temp.line+=root[i];
                que.push(temp);
            }
        }
    }

}
int main()
{
    //freopen("in.txt","r",stdin);
    cin.sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        string fuck;
        cin>>fuck;
        for(int j=1;j<=m;j++) mapp[i][j]=fuck[j-1]-'0';
    }
    dfs();
    return 0;
}

 

posted @ 2017-04-03 11:02  猪突猛进!!!  阅读(371)  评论(0编辑  收藏  举报