DFS 고전 템 플 릿 문제 --- 미로 (경로 출력)
20358 단어 알고리즘 노트
//#include
#include
#include
#include
#include
using namespace std;
int n;
int map[105][105];//
int vis[105][105];//
int next_Step[4][2]={{1,0},{0,-1},{-1,0},{0,1}};// ,
int cnt;//
int step;//
struct point{//
int x,y;
}p;
stack<point> path,temp;// , , ( )
void dfs(int sx,int sy,int step){
if(sx==n && sy==n){//
printf("**path%d**
",++cnt);
while(!path.empty()){//
point p1=path.top();//
path.pop();//
temp.push(p1);//p1 temp
}
while(!temp.empty()){// temp
point p1=temp.top();
temp.pop();
path.push(p1);
printf("-->(%d,%d)",p1.x,p1.y);
}
printf("
");
printf("steps of the path%d:%d",cnt,step);
printf("
");
return ;
}
if(sx<1 || sx>n || sy<1 || sy>n){// return
return;
}
for(int i=0;i<4;i++){//
int ex=sx+next_Step[i][0];//
int ey=sy+next_Step[i][1];
if(ex>=1 && ex<=n && ey>=1 && ey<=n && map[ex][ey]==0 && vis[ex][ey]==0){// ( )
vis[ex][ey]=1;//
p.x=ex;
p.y=ey;
path.push(p);//
dfs(ex,ey,step+1);//
vis[ex][ey]=0; //
path.pop();// ,
}
}
return ;
}
int main(){
cnt = 0;
p.x = 1;
p.y = 1;
path.push(p);
cin >> n;
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=n+1;j++)
{
if(i==0||j==0||i==n+1||j==n+1){
map[i][j]=1;
}else{
vis[i][j] = 0;
scanf("%d",&map[i][j]);
}
}
}
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=n+1;j++)
{
printf("%d ",map[i][j]);
}
printf("
");
}
dfs(1,1,0);
return 0;
}
Tips: 만약 에 출력 미로 만 몇 개의 경로 가 있다 면 제목 은 매우 간단 할 것 입 니 다. 여 기 는 모든 가능 한 경 로 를 제공 해 야 하기 때문에 디자인 할 때 두 개의 스 택 을 만들어 야 합 니 다. 한 경로 스 택 에 임시 스 택 을 만들어 야 합 니 다. 이 곳 은 주의 와 기술 이 필요 합 니 다.전체적으로 말 하면 이 문 제 는 dfs 의 템 플 릿 문제 로 손 을 많이 연습 할 수 있 습 니 다 ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
leetcode 스크립트 일기의 검증 두 갈래 검색 트리두 갈래 나무를 정해 효과적인 두 갈래 검색 나무인지 아닌지를 판단한다. 두 갈래 검색 트리에는 다음과 같은 정의가 있습니다. 예 1: 두 갈래 나무[2,1,3],true로 돌아갑니다. 예 2: 두 갈래 나무[1,2...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.