博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj-2049 Finding Nemo *
阅读量:6822 次
发布时间:2019-06-26

本文共 1860 字,大约阅读时间需要 6 分钟。

【转】 (看了题目,感觉用广搜, 就没做~  直接转一个~ ) 搜索题,我的做法是用优先队列(保证当前所通过的门是最少的),所以遇见出口,就可以直接得到结果, 搜索从Nemo的位置开始,有三种情况,遇见门,door加1,入队,遇见air,直接入队,遇见墙,continue; 我的存储结构见代码, 这里还要注意两点,一是Nemo的位置可能超出[1--199],所以开始时有必要进行判断(因为这,n个runtime error ,郁闷了几个小时。。)二是这个如果用C++提交的话,好像输入Nemo的位置时,必须用cin(不能用scanf,当然G++也可以通过的),这是偶然在discuss上看到的,要不,不知又要郁闷多久。。。 #include
#include
using namespace std; int map[2][250][250],posi[250][250];//我用小方形的左下的坐标表示这个小方形(譬如,Nemo的坐标为(1.5,1.5),则他所在的小方形为(1,1)),posi[i][j]指的是小方形的坐标,map[0][i][j]为坐标为(i,j),平行于x轴的一个墙(或门,空气),map[1][i][j]则为平行于y轴的 typedef struct nn{
int x; friend bool operator<(struct nn n1,struct nn n2) {
return n1.door > n2.door; } int y,door; }po;//door记录了到达小方形(i,j)所通过的最少门数, int main(void) {
int i,j,n,m,x,y,d,t,tx,ty,td,flag,door,txx,tyy,maxx,maxy,minx,miny; int dd[4]={
0,1,1,0},xx[4]={
0,0,1,0},yy[4]={
0,0,0,1},xxx[4]={
0,-1,1,0},yyy[4]={
-1,0,0,1};//dd[]指到某个方形后可去的四个方向,我是按下、左、右、上的顺序,xx[],yy[],xxx[],yyy[]与之对应,xx[],yy[]指去这个方向时要通过的边的坐标(map[][][]),xxx,yyy指通过边后到达的新的小方形的坐标(posi[][]), double f1,f2; po tem; priority_queue
q; while(scanf("%d%d",&m,&n)!=EOF) {
if(m==-1&&n==-1) break; for(i=0;i<201;i++) for(j=0;j<=200;j++) {
posi[i][j]=0; map[0][i][j]=0; map[1][i][j]=0;//0指为air } maxx=maxy=-20; minx=miny=220; while(m--) {
scanf("%d%d%d%d",&x,&y,&d,&t); for(i=0;i
maxx) maxx=x; if(y>maxy) maxy=y; } while(n--) {
scanf("%d%d%d",&x,&y,&d); map[d][x][y]=2;//2指door } scanf("%lf%lf",&f1,&f2); x=(int)f1; y=(int)f2; if(x
=maxx||y>=maxy) { printf("0\n"); continue; } while(!q.empty()) q.pop(); tem.x=x; tem.y=y; tem.door=0; q.push(tem); flag=0; posi[x][y]=1; while(!q.empty()) { tem=q.top(); q.pop(); x=tem.x; y=tem.y; door=tem.door; if(x>=maxx||x
=maxy||y

转载地址:http://zpozl.baihongyu.com/

你可能感兴趣的文章