semana2 lição de casa 1-labirinto

Título

Dongdong tem um mapa e deseja encontrar o papel da irmã através do mapa. O mapa mostra que 0 significa que você pode andar, 1 significa que você não pode andar, o canto superior esquerdo é a entrada e o canto inferior direito é o papel irmão.Estas duas posições são garantidas como 0. Agora que você conhece o mapa, não é difícil para Dongdong encontrar papel-irmão.Por favor, escreva um programa para escrever a rota mais curta para Dongdong encontrar papel-irmão. A entrada é uma matriz bidimensional 5 × 5, composta por apenas 0 e 1 dígitos, representando um mapa de matriz normal. Várias linhas são exibidas, representando as coordenadas do caminho mais curto do canto superior esquerdo ao canto inferior direito, no formato mostrado na amostra. Os dados são garantidos para ter uma solução única.

Idéias

Usei o método dfs para encontrar o caminho, usando duas matrizes constantes para representar as quatro direções de movimento para cima, baixo, esquerda e direita e usando uma variável de vetor e pilha para armazenar o caminho.
Na função dfs, determine se o elemento final é o ponto final, caso contrário continue a olhar para baixo de acordo com a ordem do índice da matriz constante.Se o próximo ponto puder ser alcançado, ou seja, tong () retorna true, marque o ponto e adicione A pilha continua se recuperando. Quando você chega a um beco sem saída, ou seja, não há como chegar nas quatro direções, você libera o ponto da pilha e continua a recursão.

Sumário

Essa pergunta levou muitos desvios. O caminho do armazenamento também é inteligente. Uso uma matriz para armazenar o índice constante de cada operação. Sou estúpido o suficiente para esquecer que o vetor foi salvo e quase esqueci o conhecimento do gráfico. Eu inventei.

Código

#include<stdio.h>
#include<iostream>
using namespace std;

int sx=1,sy=1,ex=5,ey=5,step=0;
const int dx[4]={1,0,-1,0};	//表示移动方向
const int dy[4]={0,1,0,-1};
int mp[7][7]=
{
    {1,1,1,1,1,1,1},
    {1,0,0,0,0,0,1},
    {1,0,0,0,0,0,1},
    {1,0,0,0,0,0,1},
    {1,0,0,0,0,0,1},
    {1,0,0,0,0,0,1},
    {1,1,1,1,1,1,1}
};
int arrive[7][7]=
{
    {0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0}
};
struct point
{
	int x,y;
	point(int _x=1,int _y=1):x(_x),y(_y){};
};
vector<point> lu;
int pos[25];//存储路径 
static int count=0;

bool tong(int i,int nx,int ny)
{
	nx += dx[i];
    ny += dy[i];
    return (nx >= 1 && nx <= 5 && ny >= 1 && ny <= 5 && mp[nx][ny] != 1 && !arrive[nx][ny]);
}
void dfs()
{
	point t=lu.back();

	if(t.x==ex&&t.y==ey)return; //到达终点
	int nx=t.x,ny=t.y;

    if (tong(0,nx,ny)) {
    	nx += dx[0];
        ny += dy[0];
    	arrive[nx][ny]=1;
    	pos[step++]=0;
    	point t(nx,ny);
        lu.push_back(t);
        dfs();
    }
    else  if (tong(1,nx,ny)) {
   		nx += dx[1];
        ny += dy[1];
    	arrive[nx][ny]=1;
    	pos[step++]=1;
    	point t(nx,ny);
        lu.push_back(t);
        dfs();
    }
    else  if (tong(2,nx,ny)) {
    	nx += dx[2];
        ny += dy[2];
    	arrive[nx][ny]=1;
    	pos[step++]=2;
    	point t(nx,ny);
        lu.push_back(t);
        dfs();
    }
    else if (tong(3,nx,ny)) {
    	nx += dx[3];
        ny += dy[3];
    	arrive[nx][ny]=1;
    	pos[step++]=3;
    	point t(nx,ny);
        lu.push_back(t);
        dfs();
    }
    else 
	{
		if(step) //返回上一层 
		step--;
		lu.pop_back();
		if(lu.size()){
			point t=lu.back();
			dfs();
		}
	   else {
		cout<<"no way"<<endl;
		}
	}   
}
void showPath()
{
	int xx=0,yy=0;
	cout << "(" << xx << ", " << yy << ")" << endl;	
	for(int i=0;i<step;i++)
	{
		xx = xx + dx[pos[i]];
    	yy = yy + dy[pos[i]];
        cout << "(" << xx << ", " << yy << ")" << endl;
	}
}
int main()
{
	point beg(1,1);
	lu.push_back(beg);
	for(int i=1;i<=5;i++)
		for(int j=1;j<=5;j++)
			cin>>mp[i][j];				
	dfs();
	showPath();
	return 0;
}



Publicado 20 artigos originais · elogiado 3 · visitas 464

Acho que você gosta

Origin blog.csdn.net/qq_44893580/article/details/104621584
Recomendado
Clasificación