标签:
2 3 3 2 1 1 1 1 0 1 1 3 4 8 2 1 1 0 1 1 1 0 1 0 4 1 1 0 4 1 1 0 0 0 0 0 0 1 1 1 1 4 1 1 1 3
4 -1
题意是:起点为2终点为3 炸弹会在6分钟内爆炸(当刚好走出迷宫剩余时间为0也会爆炸) 必须在炸弹爆炸之前走出迷宫
当遇到4时时间可以重置为6 当走到4时剩下时间为0则不能重置时间,如果可以在规定时间内走出迷宫则输出走的步数
否则输出-1
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#define MAX 10
using namespace std;
int map[MAX][MAX];
int vis[MAX][MAX];
int n,m,t,sum;
int x1,x2,y1,y2;
struct node
{
int x,y;
int step,time;
friend bool operator < (node a,node b)
{
return a.step>b.step;
}
};
void bfs()
{
int move[4][2]={0,1,0,-1,1,0,-1,0};
int i,j;
priority_queue<node>q;
node beg,end;
beg.x=x1;
beg.y=y1;
beg.step=0;
beg.time=6;//用来记录在遇到可以重置时间(4)之前走了多少步
q.push(beg);
vis[x1][y1]=1;
while(!q.empty())
{
end=q.top();
q.pop();
if(end.x==x2&&end.y==y2)
{
printf("%d\n",end.step);
return ;
}
if(end.time==1)//判断当剩下一步的时候是否到达终点(因为当剩下0步时即使是
//到了可以重置时间的地方也没用)
continue;
for(i=0;i<4;i++)
{
beg.x=end.x+move[i][0];
beg.y=end.y+move[i][1];
if(0<=beg.x&&beg.x<n&&0<=beg.y&&beg.y<m&&map[beg.x][beg.y]!=0)
{
if(map[beg.x][beg.y]==4)//当遇到4
{
beg.time=6;//步数时间重新变为6
map[beg.x][beg.y]=0;
}
else
beg.time=end.time-1;//否则 走一步时间减1
beg.step=end.step+1;
q.push(beg);
}
}
}
printf("-1\n");
}
int main()
{
int i,j,k,s;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]==2)
{
x1=i;y1=j;
}
if(map[i][j]==3)
{
x2=i;y2=j;
}
}
}
sum=0;
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4631626.html