Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 9267 | Accepted: 2192 |
Description
Input
Output
Sample Input
8 9 1 1 1 3 2 1 1 3 3 1 1 3 4 1 1 3 1 1 0 3 1 2 0 3 1 3 0 3 1 4 0 3 2 1 1 2 2 1 2 3 1 3 1 1 3 2 1 3 3 1 1 2 0 3 3 0 4 3 1 1.5 1.5 4 0 1 1 0 1 1 1 1 1 2 1 1 1 1 2 0 1 1.5 1.7 -1 -1
Sample Output
5 -1
Source
题目大意:有一个迷宫,在迷宫中有墙与门
有m道墙,每一道墙表示为(x,y,d,t)
x,y表示墙的起始坐标
d为0即向右t个单位,都是墙
d为1即向上t个单位,都是墙
有n道门,每一道门表示为(x,y,d)
x,y表示门的起始坐标
d为0即向右一个单位表示门
d为1即向上一个单位表示门
再给出你起点的位置(f1,f2),并保证这个点的位置不会再墙或者门中,为起点到(0,0)最少要穿过多少条门
空地为0,墙为INF,门为1
首先全赋值为墙
然后根据输入来赋值
这样就便于搜索了
这里要注意的是要全部搜索完,因为要穿过最少的门,用优先队列搞定
还有当在迷宫外面时,直接输出0
因为迷宫可能在[1,199]但是目标人物所在坐标可能超出这个范围
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using namespace std;
int h[300][300],l[300][300],dis[300][300],maxx,maxy;
int sx,sy;
struct node
{
int x,y,door;
bool operator <(const node&a)const//优先队列
{
return a.doorq;
while(!q.empty())
q.pop();
for(int i=0;i<=maxx;i++)
{
for(int j=0;j<=maxy;j++)
{
dis[i][j]=inf;//全赋值为墙
}
}
struct node c;
dis[0][0]=0;//从0,0点出发,穿过墙的个数
c.x=0;
c.y=0;
c.door=0;//穿过墙的个数
q.push(c);
while(!q.empty())
{
c=q.top();
q.pop();
int x=c.x,y=c.y;
if(x==sx&&y==sy)
return ;
if(x+1<=maxx&&dis[x+1][y]>dis[x][y]+l[x+1][y])//向右,开始全赋值为墙,所以只要是无穷大就没访问过
{
dis[x+1][y]=dis[x][y]+l[x+1][y];//门为1,所以加起来小于无穷大
c.y=y;
c.door=dis[x+1][y];
c.x=x+1;
q.push(c);
}
if(y+1<=maxy&&dis[x][y+1]>dis[x][y]+h[x][y+1])
{
dis[x][y+1]=dis[x][y]+h[x][y+1];
c.x=x;
c.door=dis[x][y+1];
c.y=y+1;
q.push(c);
}
if(x-1>=0&&dis[x-1][y]>dis[x][y]+l[x][y])
{
dis[x-1][y]=dis[x][y]+l[x][y];
c.y=y;
c.door=dis[x-1][y];
c.x=x-1;
q.push(c);
}
if(y-1>=0&&dis[x][y-1]>dis[x][y]+h[x][y])
{
dis[x][y-1]=dis[x][y]+h[x][y];
c.x=x;
c.door=dis[x][y-1];
c.y=y-1;
q.push(c);
}
}
dis[sx][sy]=-1;
}
int main()
{
int n,m,x,y,d,t;
double fx,fy;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(n==-1&&m==-1)
break;
maxx=-1;
maxy=-1;
memset(h,0,sizeof(h));
memset(l,0,sizeof(l));
while(m--)
{
scanf("%d%d%d%d",&x,&y,&d,&t);
if(d==0)
{
for(int i=0;imaxx||fy>maxy)//超出范围
{
printf("0\n");
continue;
}
bfs();
printf("%d\n",dis[sx][sy]);
}
return 0;
}