[蓝桥杯]迷宫(路径的存储和打印是关键,orz)

//存储容器:1:node father[maxn][maxn];//当前节点的父节点

2:struct node//***
{
    int x,y,d;
    char pos;//存储D L R U
};

具体存储:

for(int i=0;i<4;i++){

int tox=now.x+dix[i];

 int toy=now.y+diy[i];

father[tox][toy].x=tox;

father[tox][toy].y=toy;

if(i==0)//存储路径
    father[tx][ty].pos='D';
   else if(i==1)
    father[tx][ty].pos='L';
   else if(i==2)
    father[tx][ty].pos='R';
   else if(i==3)
    father[tx][ty].pos='U';
}

打印:

dfs(29,49);//终点坐标

void dfs(int x,int y)//递归打印
{
    if(x==0&&y==0)//找到起点开始正向打印路径
        return;
    else
        dfs(father[x][y].x,father[x][y].y);

    cout<

ACcode:

#include
using namespace std;
#define maxn 2000

char maze[maxn][maxn];//地图 
bool vis[maxn][maxn];//标记
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};//D L R U,(以这个顺序走,第一个到达终点的不然是字典序最小,因为走的时候就要求字典序最小) 
//char idr[]={'D','L','R','U'}; //和移动方向配对,方便下方的标记从上一点到当前点所走的方向 
bool in(int x,int y)//坐标算法合理 
{
    return x<30&&x>=0&&y>=0&&y<50;
}

struct node//***
{
    int x,y,d;
    char pos;//存储D L R U
};

node father[maxn][maxn];//当前节点的父节点
node now,nex;//指向当前和下一个位置

void dfs(int x,int y)//递归打印
{
    if(x==0&&y==0)//找到起点开始正向打印路径
        return;
    else
        dfs(father[x][y].x,father[x][y].y);

    cout< q;
    now.x=x;
    now.y=y;
    now.d=0;
    q.push(now);//起点入队 

    vis[x][y]=true;//起点标记为访问过 
    
    while(!q.empty())//核心 
    {
        now=q.front();//拿出队头 
        q.pop();//拿完了就弹出来
		 
        if(now.x==29&&now.y==49){//到达终点,结束 
        	break;
		}
        for(int i=0;i<4;i++)//走下左右上按字典序的四个方向
        {
            int tx=now.x+dir[i][0];
            int ty=now.y+dir[i][1];
            if(in(tx,ty)&&!vis[tx][ty]&&maze[tx][ty]!='1')//判断是否超出范围,是否用过,是否为1
            {
                vis[tx][ty]=true;//标记为用过

                nex.x=tx;
                nex.y=ty;
                nex.d=now.d+1;//d其实没必要,统计步数 
                q.push(nex);//压入队列

                father[tx][ty].x=now.x;//存储父节点坐标********************
                father[tx][ty].y=now.y;
                
                if(i==0)//存储路径
                    father[tx][ty].pos='D';
                else if(i==1)
                    father[tx][ty].pos='L';
                else if(i==2)
                    father[tx][ty].pos='R';
                else if(i==3)
                    father[tx][ty].pos='U';


            }
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    
    for(int i=0;i<30;i++){//输入 
    	for(int j=0;j<50;j++){
    		cin>>maze[i][j];
		}
	}
    bfs(0,0);//bfs 
    dfs(29,49);//打印路径
    return 0;
}

overover~

你可能感兴趣的:(深度优先,bfs,算法,c++)