미로 탈출(BFS/DFS)
33863 단어 순서
Problem Description
주어진 m× n(m 행,n 열)의 미로,미로 에는 두 개의 위치 가 있 습 니 다.gloria 는 미궁의 한 위치 에서 다른 위치 로 가 고 싶 습 니 다.물론 미로 중 일 부 는 공 터 이 고 gloria 는 통과 할 수 있 습 니 다.어떤 곳 은 장애 입 니 다.그녀 는 돌아 가 야 합 니 다.미궁의 한 위치 에서 그 와 인접 한 4 개의 위치 까지 만 갈 수 있 습 니 다.물론 걷 는 과정 에서 gloria 는 미로 밖으로 나 갈 수 없습니다.골 치 아 픈 것 은 글로 리 아 는 방향 감각 이 별로 없 는 사람 이기 때문에 그녀 는 걷 는 과정 에서 너무 많이 구 부 러 져 서 는 안 된다.그렇지 않 으 면 그녀 는 쓰 러 질 것 이다.우 리 는 주어진 두 위치 가 모두 공 터 라 고 가정 합 니 다.처음에 gloria 가 향 하 는 방향 은 정 해 지지 않 았 습 니 다.그녀 는 네 방향 중 하 나 를 선택 하여 출발 할 수 있 습 니 다.한 번 의 커 브 가 아 닙 니 다.글로 리 아 는 한 자리 에서 다른 자리 로 갈 수 있 을까요?
Input
첫 번 째 행 위 는 하나의 정수 t(1≤t≤100)로 테스트 데이터 의 개 수 를 나타 내 고 그 다음은 t 조 테스트 데이터 이 며,각 조 테스트 데이터 중 첫 번 째 행 위 는 두 개의 정수 m,n(1≤m,n≤100)으로 각각 미궁의 줄 수 와 열 수 를 나타 내 며,그 다음 m 행 은 n 개의 문 자 를 포함 하 며,그 중 문자'를 포함한다.'이 위 치 를 공 터 로 표시 하고 문자'*'는 이 위 치 를 장애 로 표시 한다.입력 데이터 중 이 두 가지 문자 만 있 습 니 다.각 조 테스트 데이터 의 마지막 행 위 는 5 개의 정수 k,x1,y1,x2,y2(1≤k≤10,1≤x1,x2≤n,1≤y1,y2≤m)입 니 다.그 중에서 k 는 gloria 가 가장 많이 돌 수 있 는 커 브 수 를 표시 합 니 다.(x1,y1),(x2,y2)는 두 개의 위 치 를 표시 합 니 다.그 중에서 x1,x2 대응 열,y1,y2 대응 행 을 표시 합 니 다.
Output
각 그룹의 테스트 데 이 터 는 한 줄 로 대응 합 니 다.만약 gloria 가 한 위치 에서 다른 위치 로 갈 수 있다 면"yes"를 출력 합 니 다.그렇지 않 으 면"no"를 출력 합 니 다.
Sample Input
2 5 5 …** *.. … … … 1 1 1 1 3 5 5 … *.*. … … *… 2 1 1 1 3
Sample Output
no yes
미로 문 제 는 bfs 와 dfs bfs 를 이용 한 코드 를 다음 과 같이 고려 할 수 있 습 니 다(hdu 가 통과 한).
#include
#include
using namespace std;
char s[105][105];
int n, m;
int k, x1, x2, y11, y2;
int vis[105][105];
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
int flag;
struct node {
int x, y;
int cnt;
};
int bfs()
{
queue<node>q;
memset(vis, 0, sizeof(vis));
node f, t;
f.x = x1;
f.y = y11;
f.cnt = -1;
q.push(f);
vis[x1][y11] = 1;
while (!q.empty())//q ture, false
{
node h = q.front();
q.pop();
if (h.x == x2 && h.y == y2 && h.cnt <= k)
//flag = true;
return 1;
for (int i = 0;i < 4;i++)
{
t.x = h.x + dx[i];
t.y = h.y + dy[i];
while (t.x >= 1 && t.x <= n && t.y >= 1 && t.y <= m && s[t.x][t.y] == '.')
{
if (vis[t.x][t.y] == 0)
{
t.cnt = h.cnt + 1;
vis[t.x][t.y] = 1;
q.push(t);
}
node t2;
t2.x = t.x + dx[i];
t2.y = t.y + dy[i];
t = t2;
}
}
}
return 0;
}
int main()
{
int t;
scanf_s("%d", &t);
while (t--)
{
flag = 0;
scanf_s("%d %d", &n, &m);
for(int i=1;i<=n;i++)
for (int j = 1;j <= m;j++)
{
cin >> s[i][j];
}
scanf_s("%d %d %d %d %d", &k, &y11, &x1, &y2, &x2);
flag = bfs();
if (flag)
printf("yes
");
else
printf("no
");
}
return 0;
}
DFS :
```c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define Max 0x3f3f3f
using namespace std;
char map[110][110];
int turn[110][110];
int n, m, x2, y2, ok, k;
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
void dfs(int x, int y, int dir)
{
int i, xx, yy;
if (x == x2 && y == y2 && turn[x][y] <= k)
{
ok = 1;
return;
}
if (turn[x][y] > k)
return;
if (x != x2 && y != y2 && turn[x][y] == k)
return;
for (i = 0;i < 4;i++)
{
xx = x + dx[i];
yy = y + dy[i];
if (xx <= 0 || yy <= 0 || xx > m || yy > n || map[xx][yy] == '*')
continue;
if (turn[xx][yy] < turn[x][y])
continue;
if (dir != -1 && i != dir && turn[xx][yy] < turn[x][y] + 1)
continue;
if (dir != -1 && i != dir)
turn[xx][yy] = turn[x][y] + 1;
else
turn[xx][yy] = turn[x][y];
map[xx][yy] = '*';
dfs(xx, yy, i);
map[xx][yy] = '.';
if (ok)
return;
}
}
int main()
{
int i, j, t, x1, y11;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &m, &n);
for (i = 1;i <= m;i++)
for (j = 1;j <= n;j++)
scanf(" %c", &map[i][j]);
scanf("%d%d%d%d%d", &k, &y11, &x1, &y2, &x2);
memset(turn, Max, sizeof(turn));
ok = 0;
turn[x1][y11] = 0;
dfs(x1, y11, -1);
if (ok)
printf("yes
");
else
printf("no
");
}
return 0;
}
자세 한 내용 은 참고 하 시 오
Jonariguez
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Sql의 실행 순서가 어떻게 되는지 알려드릴게요.select*단지 당신이 Sql 대문에 들어서는 첫걸음일 뿐, 실제 업무에서 틀림없이 이렇게 간단하지 않을 것이다.우리 예를 하나 봅시다. 위의 요구 사항을 수행하려면 다음과 같이 Sql을 사용할 수 있습니다. 위의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.