데이터 구조의 스 택 과 대기 열 - 미로 로 가기 (dfs 깊이 검색)
2390 단어 데이터 구조
Time Limit: 1000MS Memory limit: 65536K
제목 설명
n * m 칸 으로 구 성 된 미로 입 니 다. 출발점 은 (1, 1) 이 고 종점 은 (n, m) 입 니 다. 매번 상하 좌우 네 방향 으로 한 걸음 씩 마음대로 걸 을 수 있 습 니 다. 그리고 어떤 칸 은 걸 을 수 없습니다. 출발점 에서 종점 까지 모든 칸 에서 한 번 이상 걸 을 수 있 는 방법 을 구 합 니 다.
입력
첫 줄 의 정수 T 는 T 조 테스트 데이터 가 있 음 을 나타 낸다.(T <= 110)
각 그룹의 테스트 데이터:
첫 번 째 줄 의 정수 n, m 는 미로 에 n * m 칸 이 있다 는 것 을 나타 낸다.(1 < = n, m < = 6, (n, m)! = (1, 1) 다음 n 줄, 줄 당 m 개 수.그 중에서 i 줄 의 j 개 수 는 0 으로 i 줄 의 j 개 칸 이 갈 수 있다 는 것 을 나타 낸다. 그렇지 않 으 면 1 은 이 칸 이 갈 수 없다 는 것 을 나타 내 고 입력 은 출발점 과 종점 이 모두 갈 수 있다 는 것 을 보증한다.
임의의 두 조 의 테스트 데이터 간 에 빈 줄 로 나 뉜 다.
출력
각 조 의 테스트 데이터 에 대해 하나의 정수 R 을 출력 하면 R 가지 방법 이 있 음 을 나타 낸다.
예제 입력
3
2 2
0 1
0 0
2 2
0 1
1 0
2 3
0 0 0
0 0 0
예제 출력
1
0
4
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
unsigned int map[6][6];
bool vis[6][6];
int dir[4][2]={{0, -1}, {0, 1}, {1, 0}, {-1, 0} }; //
int cnt; //
int n, m;
void dfs(int x, int y)
{
int i, j;
int xx, yy;
for(i=0; i<4; i++)
{
xx=x+dir[i][0];
yy=y+dir[i][1]; //
if( xx>=0 && xx<n && yy>=0 && yy<m && map[xx][yy]==0 && vis[xx][yy]==false ) //
{
if(xx==n-1 && yy==m-1)
{
cnt++;
continue;
}
else
{
vis[xx][yy]=true; //
dfs(xx, yy); // dfs
vis[xx][yy]=false; // dfs , ,
// , ,
//
}
}
}
}
int main()
{
int t;
cin>>t;
int i, j;
while(t--)
{
cin>>n>>m;
cnt=0;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
cin>>map[i][j];
vis[i][j]=false;
}
}
vis[0][0]=true;
dfs(0, 0);
cout<<cnt<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.