记录路径问题和层数利用结构体变量可以很容易的实现 这里要求路劲字典序列最小 改变一下优先的方向就可以了(注意实际方向和二维数组的对应关系,坑死我了),还有就是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; }