HDU 1072 Nightmare (BFS)
2014-06-04 15:58
357 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072
题目大意:
走迷宫,初始剩余时间为6min,每步1min;到reset区是若剩余时间大于0,则可以重置。到终点3区,若时间大于0,则成功逃脱。(可以走回路)
0:wall
1:可以走
2:起点
3:终点
4:剩余时间重置为6
源代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define maxn 1001
using namespace std;
int go[4][2] = { {-1,0} , {1,0} , {0,-1} , {0,1}};
int s,n,m;
struct node{
int x,y;
int pos;
int time;
int rest;
}p[maxn*maxn];
int BFS()
{
//cout<<s<<endl;
node next;
queue<node> que;
que.push(p[s]);
while(!que.empty())
{
for(int i=0;i<4;i++)
{
int x=que.front().x+go[i][0];
int y=que.front().y+go[i][1];
if(x>0&&x<=n&&y>0&&y<=m&&p[(x-1)*m+y].pos!=0&&que.front().rest>1)
{ //cout<<p[(x-1)*n+y].pos<<"--->\n";
if(p[(x-1)*m+y].pos==3)
return que.front().time+1;
else
{
if(p[(x-1)*m+y].pos==4)
{
next.rest=6;
p[(x-1)*m+y].pos=0;
}
else
next.rest=que.front().rest-1;
next.time=que.front().time+1;
next.x=x;
next.y=y;
que.push(next);
}
}
}
que.pop();
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int v,num;
num=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&v);
p[++num].pos=v;
p[num].x=i;
p[num].y=j;
p[num].time=0;
p[num].rest=0;
if(v==2)
{
s=num;
p[num].rest=6;
}
}
printf("%d\n",BFS());
}
return 0;
}
题目大意:
走迷宫,初始剩余时间为6min,每步1min;到reset区是若剩余时间大于0,则可以重置。到终点3区,若时间大于0,则成功逃脱。(可以走回路)
0:wall
1:可以走
2:起点
3:终点
4:剩余时间重置为6
源代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define maxn 1001
using namespace std;
int go[4][2] = { {-1,0} , {1,0} , {0,-1} , {0,1}};
int s,n,m;
struct node{
int x,y;
int pos;
int time;
int rest;
}p[maxn*maxn];
int BFS()
{
//cout<<s<<endl;
node next;
queue<node> que;
que.push(p[s]);
while(!que.empty())
{
for(int i=0;i<4;i++)
{
int x=que.front().x+go[i][0];
int y=que.front().y+go[i][1];
if(x>0&&x<=n&&y>0&&y<=m&&p[(x-1)*m+y].pos!=0&&que.front().rest>1)
{ //cout<<p[(x-1)*n+y].pos<<"--->\n";
if(p[(x-1)*m+y].pos==3)
return que.front().time+1;
else
{
if(p[(x-1)*m+y].pos==4)
{
next.rest=6;
p[(x-1)*m+y].pos=0;
}
else
next.rest=que.front().rest-1;
next.time=que.front().time+1;
next.x=x;
next.y=y;
que.push(next);
}
}
}
que.pop();
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int v,num;
num=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&v);
p[++num].pos=v;
p[num].x=i;
p[num].y=j;
p[num].time=0;
p[num].rest=0;
if(v==2)
{
s=num;
p[num].rest=6;
}
}
printf("%d\n",BFS());
}
return 0;
}
相关文章推荐
- HDU 1072 Nightmare(bfs 广度优先搜索)
- hdu - 1072 Nightmare(bfs)
- hdu_1072_Nightmare(BFS)
- HDU_1072 Nightmare(BFS)
- Hdu 1072 Nightmare[Bfs]
- hdu_1072_Nightmare(BFS)
- HDU 1072 Nightmare(BFS)(注:不标记每个节点四方向累计4次剪枝)
- hdu 1072 Nightmare bfs
- HDU-1072Nightmare(bfs+可重复访问)
- HDU 1072 Nightmare (bfs)
- hdu1072 Nightmare(bfs)
- bfs-hdu-1072-Nightmare
- hdu 1072 Nightmare (bfs+贪心)
- Nightmare (HDU 1072)—— BFS
- hdu1072 Nightmare(bfs)
- HDU 1072 Nightmare(BFS)
- hdu1072 Nightmare(bfs)
- hdu_1072_nightmare_BFS_用时间来限定
- hdu 1072 Nightmare--bfs
- hdu1072 Nightmare (BFS)