HDU 1180 기괴 한 계단 bfs
10230 단어 HDU
http://acm.hdu.edu.cn/showproblem.php?pid=1180
제목 분석:
이것 은 우리 에 게 가장 짧 은 시간 을 찾 으 라 는 것 이다.일반적으로 이런 문제 에 부 딪 히 면 모두 BFS 로 해 야 한다.
이 지 도 는 바 뀔 수 있 기 때문에 우 리 는 그의 서로 다른 시간의 지 도 를 저장 한 다음 에 시간 에 따라 어떤 지 도 를 사용 해 야 하 는 지 확인 해 야 한다.
우선 스 택 노드 에 들 어 가 는 데 필요 한 속성 을 확인 해 야 합 니 다.
좌표 x,y
현재 상태 s 는 현재 맵 을 사용 할 지 확인 하 는 데 사 용 됩 니 다.
타임 타임
그 밖 에 우 리 는 배열 vis[지도][x][y]를 표시 해 야 한다.
이 점 이 창고 에 들 어 갔 는 지 아 닌 지 를 판단 하 는 데 쓰 인 다.그렇지 않 으 면 창고 가 터 질 것 이다.
#include <iostream>
#include <vector>
#include <stack>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
#define maxn 120
#define INF 0xffffff
struct Point
{
int x, y;
int time;
int s;
}Ps, Pe;
int dir[5][2] = { {0,0},{1,0},{-1,0},{0,1},{0,-1} };
char maps[2][maxn][maxn];
bool vis[2][maxn][maxn];
int m, n;
bool OK(Point P)
{
return P.x >= 0 && P.x < m&& P.y >= 0 && P.y < n && maps[P.s][P.x][P.y] != '*' ;
}
int BFS()
{
Point Pn, P;
queue<Point> Q;
Q.push(Ps);
vis[Ps.s][Ps.x][Ps.y] = true;
while( !Q.empty() )
{
P = Q.front();
Q.pop();
if( P.x == Pe.x && P.y == Pe.y )
return P.time;
for(int i=0; i<5; i++)
{
Pn = P;
Pn.x = P.x + dir[i][0];
Pn.y = P.y + dir[i][1];
Pn.s ^= 1;
Pn.time ++;
if( OK(Pn) && maps[Pn.s][Pn.x][Pn.y] == '.' && !vis[Pn.s][Pn.x][Pn.y])
{
vis[Pn.s][Pn.x][Pn.y] = true;
Q.push(Pn);
}
else if( (maps[Pn.s^1][Pn.x][Pn.y] == '|' && i <= 2 && i >= 1 ) || (maps[Pn.s^1][Pn.x][Pn.y] == '-' && i >= 3) )
{
Pn.x += dir[i][0];
Pn.y += dir[i][1];
if( OK(Pn) && !vis[Pn.s][Pn.x][Pn.y])
{
Q.push(Pn);
vis[Pn.s][Pn.x][Pn.y] = true;
}
}
}
}
return -1;
}
int main()
{
while(cin >> m >> n)
{
memset(vis,0,sizeof(vis));
for(int i=0; i <m; i++)
{
cin >> maps[0][i];
for(int j=0; j<n; j++)
{
if(maps[0][i][j] == 'S')
Ps.x = i, Ps.y = j, Ps.time = 0, maps[0][i][j] = '.', Ps.s = 0;
if(maps[0][i][j] == 'T')
Pe.x = i, Pe.y = j, maps[0][i][j] = '.';
if(maps[0][i][j] == '|')
maps[1][i][j] = '-';
else if(maps[0][i][j] == '-')
maps[1][i][j] = '|';
else
maps[1][i][j] = maps[0][i][j];
}
}
int ans = BFS();
cout << ans << endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[HDU] 4089 활성화 확률 DPdp[i][j]를 모두 i개인의 대기열인 Tomato가 j위 서버가 마비될 확률로 역추를 사용하면 우리는 상태 이동 방정식을 얻을 수 있다. i == 1 : dp[1][1] = dp[1][1] * p1 + dp[1]...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.