2012-08-11  我的第一个A*算法:

四处看A*算法。。还是有一点没有弄明白就是那个当已经在列表中的时候再次进入的时候怎么去更新。

这道题。。有点难开始的时候不会位压缩,去看了一个别人的代码。所以感谢一下。这位高手。写了一个bfs(),500多ms。

看了A*算法后,用A*算法去改进了一下。跑到了360ms很高兴。。所以写了一下,作为学A*算法的一个纪念;

View Code

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 using namespace std;
  6 char sign[21][21][16385];
  7 char map[21][25];
  8 int m,n,L,k;
  9 int maxstep;
 10 int minstep;
 11 struct node
 12 {
 13     int xi,xj;
 14 };
 15 node pt[10];
 16 int f[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
 17 struct stem
 18 {
 19     int xi,xj;
 20     int state;
 21     int h,f,g;
 22     bool operator<(const stem &a)const
 23     {
 24      return f>a.f;
 25     }
 26 }u,v,w;
 27 void setmap(node *_pt)
 28 {
 29    int i;
 30    for(i=1;i<L;i++)
 31    {
 32         map[_pt[i].xi][_pt[i].xj]=1;
 33    }
 34 }
 35 void clearmap(node *_pt)
 36 {
 37     int i;
 38     for(i=1;i<L;i++)
 39     map[_pt[i].xi][_pt[i].xj]=0;
 40 }
 41 int bfs(char stone[][25])
 42 {
 43     priority_queue<stem>q;
 44     w.xi=1;
 45     w.xj=1;
 46     w.g=0;
 47     w.f=pt[0].xi+pt[0].xj-2;
 48     w.h=pt[0].xi+pt[0].xj-2;
 49     q.push(w);
 50     int i,j;
 51     while(!q.empty())
 52     {
 53          u=q.top();
 54          q.pop();
 55          for(i=0;i<4;i++)
 56          {
 57            v.xi=u.xi+f[i][0];
 58            v.xj=u.xj+f[i][1];
 59            if(v.xi<1||v.xi>n||v.xj<1||v.xj>m)continue;
 60            if(stone[v.xi][v.xj])continue;
 61            stone[v.xi][v.xj]=1;
 62            v.g=u.g+1;
 63            v.h=pt[0].xi-v.xi+pt[0].xj-v.xj;
 64            v.f=v.g+v.h;
 65            if(v.xi==pt[0].xi&&v.xj==pt[0].xj)return v.f;
 66            q.push(v);
 67          }
 68     }
 69     return -1;
 70 }
 71 void getmaxmin()
 72 {
 73    char stone[21][25];
 74    memcpy(stone,map,sizeof(map));
 75    minstep=bfs(stone);
 76    if(minstep==-1)return ;
 77    setmap(pt);
 78    memcpy(stone,map,sizeof(map));
 79    maxstep=bfs(stone);
 80    clearmap(pt);
 81    if(maxstep==-1)maxstep=0xffff;
 82    return ;
 83 }
 84 int getstate()
 85 {
 86     int stem;int i;
 87
 88     stem=0;
 89     for(i=1;i<L;i++)
 90     {
 91        stem<<=2;
 92        if(pt[i].xi>pt[i-1].xi)stem|=0;
 93        else if(pt[i].xi<pt[i-1].xi) stem|=1;
 94        else if(pt[i].xj>pt[i-1].xj) stem|=2;//以前面一位作为标准
 95        else
 96        stem|=3;
 97     }
 98
 99     return stem;
100 }
101 void getcord(int x,int y,int state)
102 {
103     pt[0].xi=x;
104     pt[0].xj=y;
105     int manx;
106     int step;
107     int i;manx=3;
108     for(i=1;i<L;i++)
109     {
110       step=(state>>((L-i-1)*2))&manx;
111       if(step==0) x++;
112       else if(step==1) x--;
113       else if(step==2) y++;
114       else if(step==3) y--;
115       pt[i].xi=x;
116       pt[i].xj=y;
117     }
118     return ;
119 }
120 int bfs()
121 {
122     int i;
123     priority_queue<stem>q;
124     w.xi=pt[0].xi;
125     w.xj=pt[0].xj;
126     w.g=0;
127     w.f=pt[0].xi+pt[0].xj-2;
128     w.h=pt[0].xi+pt[0].xj-2;
129     w.state=getstate();
130     q.push(w);
131     while(!q.empty())
132     {
133         u=q.top();q.pop();
134         getcord(u.xi,u.xj,u.state);
135         setmap(pt);
136         for(i=0;i<4;i++)
137         {
138             v.xi=u.xi+f[i][0];
139             v.xj=u.xj+f[i][1];
140             if(v.xi<1||v.xi>n||v.xj<1||v.xj>m)continue;
141             if(map[v.xi][v.xj])continue;
142             if(u.g+1+v.xi+v.xj-2>maxstep)continue;
143             v.state=((u.state>>2)|(i<<(L-2)*2));
144             if(sign[v.xi][v.xj][v.state])continue;
145             sign[v.xi][v.xj][v.state]=1;
146             v.g=u.g+1;
147             v.h=v.xi+v.xj-2;
148             v.f=v.g+v.h;
149             if(v.xi==1&&v.xj==1)return v.f;
150             q.push(v);
151         }
152         clearmap(pt);
153     }
154     return -1;
155 }
156 int main()
157 {
158     int i;
159     int cas;
160     cas=0;
161     while(scanf("%d%d%d",&n,&m,&L)&&(n+m+L))
162     {
163         cas++;
164         int x,y;
165         maxstep=0;
166         minstep=0;
167         for(i=0;i<L;i++)
168         {
169             scanf("%d%d",&pt[i].xi,&pt[i].xj);
170         }
171         scanf("%d",&k);
172         memset(map,0,sizeof(map));
173         memset(sign,'\0',sizeof(sign));
174         for(i=0;i<k;i++)
175         {
176             scanf("%d%d",&x,&y);
177             map[x][y]=1;
178         }
179         printf("Case %d: ",cas);
180         getmaxmin();
181         if(pt[0].xi==1&&pt[0].xj==1)printf("0\n");
182         else if(minstep==-1)printf("-1\n");
183         else if(minstep==maxstep)printf("%d\n",minstep);
184         else printf("%d\n",bfs());
185     }
186     return 0;
187 }

最后就是继续努力。。

转载于:https://www.cnblogs.com/qq774550/archive/2012/08/11/2633744.html

Holedox Moving相关推荐

  1. poj 1324 Holedox Moving

    poj 1324 Holedox Moving 题目地址: http://poj.org/problem?id=1324 题意: 给出一个矩阵中,一条贪吃蛇,占据L长度的格子, 另外有些格子是石头, ...

  2. poj 1729 Jack and Jill 1376 Robot 1324 Holedox Moving 1475 Pushing Boxes bfs + a*

    poj 1729 Jack and Jill Jack和Jill要从各自的家走到各自的学校,但是他们俩各自不喜欢对方,因此,需要你找到两个人行走的路线,使得他们路线中两个人最近的直线距离最长.单位时间 ...

  3. Holedox Moving POJ - 1324

    题目链接:Holedox Moving POJ - 1324 =================================================== Holedox Moving Ti ...

  4. POJ 1324 Holedox Moving 搜索

    题目地址: http://poj.org/problem?id=1324 优先队列---A*的估价函数不能为蛇头到(1,1)的距离,这样会出错. 看了discuss,有大神说这题A*的估价函数为BFS ...

  5. Poj 1324 Holedox Moving 状压判重+BFS

    模拟类似贪吃蛇运动,问蛇头最少移动几格到1,1 BFS好题,状态vis[20][20][16384]来存蛇头的位置,和后面每一节想对于前面一节的关系,四个方向用0,1,2,3存,需要14位 #incl ...

  6. POJ1324 Holedox Moving(BFS)

    有一条蛇蜿蜒在洞穴里面,出口为(1,1),问(蛇头)走出洞口的最小步数.走的过程不能碰到自己的身体也不能碰到石头.蛇头每移动一格,身体也要相应的移动一格.(注意:貌似当前蛇头不能移动到当前蛇尾的位置) ...

  7. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  8. 搜索题,留着以后慢慢刷

    转过来,留着以后慢 慢 刷555.. 简单搜索 (1)深度优先搜索 (poj2488,poj3009,poj1321) (2)广度优先搜索 (poj3278,poj1426,poj3126,poj30 ...

  9. 客户旅程_从编码训练营到报价—我的1280小时旅程

    客户旅程 So, why am I writing this? My goal is to give some insight into the time commitment required to ...

最新文章

  1. 终于有人把Python讲清楚了!
  2. 让 CPU 告诉你硬盘和网络到底有多慢
  3. matlab z变换离散化_MATLAB作图从入门到熟练
  4. 正整数分解为几个连续自然数之和
  5. 1分钟了解协同过滤,pm都懂了
  6. postgresql建表带注释_postgresql建表带自增id和注释语句
  7. 赚钱第一,投资第二,才是正确的财富获取方式
  8. python判断不等_Python黑魔法笔记第六关:消灭该死的重复(下)
  9. 计算机主机系统总线,全国2009年10月高等教育自学考试计算机应用基础试题及答案...
  10. IIS的Server Application Error报错解决方法
  11. could not open `C:\Program Files\Java\jre7\lib\amd64\jvm.cfg' 的解决办法:
  12. 37-基于51单片机智能温控风扇设计
  13. 人工智能畅想——《人工智能简史》读后感
  14. 皮皮虾如何去水印视频
  15. Python串口通信发送浮点型数据
  16. 由RGB到HSV的转换详解
  17. POJ1984 Navigation Nightmare —— 种类并查集
  18. 推荐系统实战4——EasyRec 搭建DSSM召回模型实现CTR点击平台
  19. Github Page绑定至个人域名
  20. Mac翻译神器Mate Translate,支持超100种语言,读不准还可以照拼音念呦!

热门文章

  1. 高效快速中值滤波算法c语言,快速中值滤波及c语言实现.docx
  2. CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)
  3. php商品状态精品 热销,ecshop商品列表,商品详细页,热销,精品,搜索列表页调用商品销售量(已销售数量)...
  4. uva 1331——Minimax Triangulation
  5. [Linux]共享内存
  6. java tomcat 监控_java程序监控tomcat实现项目宕机自动重启并发送邮件提醒
  7. 排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)
  8. Linux系统编程--1(进程和程序,CPU和MMU,PCB,进程状态)
  9. Linux网络编程——I/O复用函数之epoll
  10. (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作