Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 9060 | Accepted: 2122 |
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
这个蛋疼的题。。。
题意大概是说海底总动员的小鱼尼莫是一个熊孩子,独自进入深海区不慎进入了海底迷宫,不幸的是他忘记了回家的路,他给他爸爸马林发送求救信号,他爸看了看迷宫地图(不知哪来的),迷宫里有门和墙组成。马林不能穿墙,并且也要尽量少开门(可能因为开门的时候会遭到水母的毒)。请你计算出救出他儿子的最少开门次数。
卡了我将近一天!我的思路是对的,大体代码也是对的,我一开始是用三维数组存的图,前两维是坐标,第三位是平行于x轴还是y轴,然后卡了,小豪又说我存图有问题,x轴和y轴随便写,我就改了,写完后对了一下题解看了看我的存图,恩,没错,但是他怎么遍历的比我简单,恩,好吧,按照网上的改了改,又优化了一遍,我还是第一次用结构体的优先队列。。。
代码:
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using namespace std;
struct node{
int x,y;
int door;
bool operator < (const node &a) const{
return a.door q;
while(!q.empty())
q.pop();
for(int i=0;i<=maxx;i++)
for(int j=0;j<=maxy;j++)
dis[i][j]=inf;
xin.x=0, xin.y=0, xin.door=0;
dis[0][0]=0;
q.push(xin);
while(!q.empty()){
xin=q.top();
q.pop();
int x=xin.x, y=xin.y;
if(x==sx && y==sy)
return ;
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];
xin.x=x;
xin.y=y+1;
xin.door=dis[x][y+1];
q.push(xin);
}
if(y-1>=0 && dis[x][y-1]>dis[x][y]+h[x][y]){
dis[x][y-1]=dis[x][y]+h[x][y];
xin.x=x;
xin.y=y-1;
xin.door=dis[x][y-1];
q.push(xin);
}
if(x-1>=0 && dis[x-1][y]>dis[x][y]+l[x][y]){
dis[x-1][y]=dis[x][y]+l[x][y];
xin.x=x-1;
xin.y=y;
xin.door=dis[x-1][y];
q.push(xin);
}
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];
xin.x=x+1;
xin.y=y;
xin.door=dis[x+1][y];
q.push(xin);
}
}
dis[sx][sy]=-1;
}
int main(){
int x,y,d,t;
double f1,f2;
while(~scanf("%d%d",&n,&m)){
if(n==-1 && m==-1)
break;
maxx=-1,maxy=-1;
memset(h,0,sizeof(h));
memset(l,0,sizeof(l));
while(n--){
scanf("%d%d%d%d",&x,&y,&d,&t);
if(d==0){
for(int i=0;imaxx || f2>maxy){
puts("0");
continue;
}
sx=(int)f1, sy=(int)f2;
BFS();
printf("%d\n",dis[sx][sy]);
}
return 0;
}