hd 1728 逃离迷宫
来源:互联网 发布:知错老师的微博 编辑:程序博客网 时间:2024/04/28 08:22
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
#define MAX 999999
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
char MAP[101][101];
int val[101][101][5];
int m, n, turn;
typedef struct
{
int x, y;
int direction;
}Node;
int main()
{
int N;
int i, j, k;
Node s, t, tt;
int sx, sy, ex, ey;
cin >> N;
while (N--)
{
cin >> m >> n;
for (i = 0;i < m; i++)
{
for (j = 0; j < n; j++)
{
cin >> MAP[i][j];
}
}
for (i = 0; i < m; i++)
for(j = 0; j < n; j++)
for(k = 1; k <= 4; k++)
val[i][j][k] = MAX;
cin >> turn;
cin >> sy >> sx >> ey >> ex;
sy--; sx--; ey--; ex--;
if (sx == ex && sy == ey)
{
cout << "yes" << endl;
continue;
}
s.x = sx;
s.y = sy;
s.direction = 0;
val[s.x][s.y][0] = 0;
val[s.x][s.y][1] = 0;
val[s.x][s.y][2] = 0;
val[s.x][s.y][3] = 0;
val[s.x][s.y][4] = 0;
queue<Node> q;
q.push(s);
bool flag = false;
while (!q.empty())
{
t = q.front();
q.pop();
if (t.x == ex && t.y == ey)
break;
for (i = 0; i < 4; i++)
{
tt.x = t.x + dir[i][0];
tt.y = t.y + dir[i][1];
tt.direction = t.direction;
if (MAP[tt.x][tt.y] == '.' && tt.x>=0&&tt.x<m && tt.y>=0&&tt.y<n)
{
int cnt = 0;
if (tt.direction == 0) //第一次
{
tt.direction = i + 1;
}
else if (tt.direction != i + 1) // 转弯
{
tt.direction = i + 1;
cnt = 1;
}
if (val[t.x][t.y][t.direction]+cnt < val[tt.x][tt.y][tt.direction] && val[t.x][t.y][t.direction]+cnt<= turn)
{
val[tt.x][tt.y][tt.direction] = val[t.x][t.y][t.direction]+cnt;
q.push(tt);
}
}
}
}
for (i=1; i<=4; ++i)
{
if(val[ex][ey][i] != MAX)
break;
}
if (i<=4)
{
cout << "yes" << endl;
}
else
cout << "no" << endl;
}
return 0;
}
#include <string>
#include <set>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
#define MAX 999999
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
char MAP[101][101];
int val[101][101][5];
int m, n, turn;
typedef struct
{
int x, y;
int direction;
}Node;
int main()
{
int N;
int i, j, k;
Node s, t, tt;
int sx, sy, ex, ey;
cin >> N;
while (N--)
{
cin >> m >> n;
for (i = 0;i < m; i++)
{
for (j = 0; j < n; j++)
{
cin >> MAP[i][j];
}
}
for (i = 0; i < m; i++)
for(j = 0; j < n; j++)
for(k = 1; k <= 4; k++)
val[i][j][k] = MAX;
cin >> turn;
cin >> sy >> sx >> ey >> ex;
sy--; sx--; ey--; ex--;
if (sx == ex && sy == ey)
{
cout << "yes" << endl;
continue;
}
s.x = sx;
s.y = sy;
s.direction = 0;
val[s.x][s.y][0] = 0;
val[s.x][s.y][1] = 0;
val[s.x][s.y][2] = 0;
val[s.x][s.y][3] = 0;
val[s.x][s.y][4] = 0;
queue<Node> q;
q.push(s);
bool flag = false;
while (!q.empty())
{
t = q.front();
q.pop();
if (t.x == ex && t.y == ey)
break;
for (i = 0; i < 4; i++)
{
tt.x = t.x + dir[i][0];
tt.y = t.y + dir[i][1];
tt.direction = t.direction;
if (MAP[tt.x][tt.y] == '.' && tt.x>=0&&tt.x<m && tt.y>=0&&tt.y<n)
{
int cnt = 0;
if (tt.direction == 0) //第一次
{
tt.direction = i + 1;
}
else if (tt.direction != i + 1) // 转弯
{
tt.direction = i + 1;
cnt = 1;
}
if (val[t.x][t.y][t.direction]+cnt < val[tt.x][tt.y][tt.direction] && val[t.x][t.y][t.direction]+cnt<= turn)
{
val[tt.x][tt.y][tt.direction] = val[t.x][t.y][t.direction]+cnt;
q.push(tt);
}
}
}
}
for (i=1; i<=4; ++i)
{
if(val[ex][ey][i] != MAX)
break;
}
if (i<=4)
{
cout << "yes" << endl;
}
else
cout << "no" << endl;
}
return 0;
}
- hd 1728 逃离迷宫
- HDOJ 1728 逃离迷宫
- HDU 1728 逃离迷宫
- HDU 1728 逃离迷宫
- hdu 1728 逃离迷宫
- hdu 1728 逃离迷宫
- hdu 1728 逃离迷宫
- hdu 1728 逃离迷宫
- HDU-1728 逃离迷宫
- hdu 1728 逃离迷宫
- HDU 1728 逃离迷宫
- hdu 1728 逃离迷宫
- Hdu 1728 逃离迷宫
- hdu 1728 逃离迷宫
- HDU 1728 逃离迷宫
- hdu 1728 逃离迷宫
- HDU 1728 逃离迷宫
- hdu(1728)逃离迷宫
- 如何去掉TextBox可输入状态时的光标
- NO8::ShowWindow
- NO9::UpdateWindow
- 如何读到电子版“潜智”
- 大家注意了,现在的域名商都是大大的骗子!!!!
- hd 1728 逃离迷宫
- JAVA世纪网 - 共享Java带给我们的快乐每一天...-Java开发人员的十大戒律
- 80x86指令系统
- Visual C#.NET编程 常见问题集锦
- 用JAVA写的电子书切割器 欢迎修改意见至wmm204@126.com
- 双硬盘安装ubuntu8.04 双linux
- 动态规划的特点及其应用[安徽 张辰]
- ErrDemo.java
- 创建数组和遍历数组