Holedox Moving

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mint mvc文件上传功能——使用篇

为什么80%的码农都做不了架构师&#xff1f;>>> 为了不打击大家的积极性&#xff0c;暂时只着重讲用法&#xff0c;原理方面暂时不讲太多。 配置web.xml 文件上传需要用到servlet3的异步处理功能。需要在web.xml配置文件中加入异步支持声明&#xff08;注释处&am…

TLS 1.2详解

TSL由多个协议组成的两层协议集合&#xff0c;工作与应用层和传输层之间。 TLS协议包含两层协议&#xff1a;记录层协议&#xff08;TLS Record Protocol协议&#xff09;和 握手协议&#xff08;TLS Handshake Protocol协议&#xff09;&#xff0c;底层采用可靠传输协议&…

个人作业2——英语学习APP案例分析

第一部分 调研&#xff0c; 评测 1.下载并使用&#xff0c;描述最简单直观的个人第一次上手体验&#xff1a; 没有各种广告&#xff0c;界面简洁&#xff0c;软件安装包略小于其他翻译软件。就内存的占用而言优于同款热门软件有道词典。 2.必应词典&#xff08;Android客户端&a…

IOS开发UI篇之──自定义加载等待框(MBProgressHUD)

这里介绍一下网友开源的MBProgressHUD类&#xff0c;实现等待框&#xff0c; 一、网上下载 MBProgessHUD 类文件&#xff0c;直接导入到工程即可 二、示例分析 在我的工程中示例如下&#xff1a; 1&#xff09;在ShowImageViewController.h头文件代码如下&#xff1a; #import…

java中跨时区的日期格式转换

2019独角兽企业重金招聘Python工程师标准>>> 先上一段代码 public class DataTransfer {public static void main(String[] args) {String dateStr "Sep 30, 2014 12:00:00 AM";SimpleDateFormat sdf new SimpleDateFormat();sdf.applyPattern("MM…

C语言读取写入CSV文件 [二]进阶篇——写入CSV文件

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 本系列文章目录 [一] 基础篇 [二] 进阶篇——写入CSV [三] 进阶篇——读取CSV 什么是 包裹&#xff08;使用双引号&…

K8S中部署apisix(非ingress)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 不使用pvc的方式在K8S中部署apisix-gateway 简介 因为公司项目准备重构&#xff0c;现在做技术储备&#xff0c;之前公司项…

机器学习理论知识部分--偏差方差平衡(bias-variance tradeoff)

摘要&#xff1a; 1.常见问题 1.1 什么是偏差与方差&#xff1f; 1.2 为什么会产生过拟合&#xff0c;有哪些方法可以预防或克服过拟合&#xff1f; 2.模型选择例子 3.特征选择例子 4.特征工程与数据预处理例子 内容&#xff1a; 1.常见问题 1.1 什么是偏差与方差&#xff1f; …

有手就行3——持续集成环境—maven、tomcat、安装和配置

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 有手就行3——持续集成环境—maven、tomcat、安装 持续集成环境**(5)-Maven****安装和配置** 持续集成环境(6)-Tomcat安装…

.netcore基础知识(一)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 先来说说web服务器 先来一张图 一个典型的进程外托管模型 我们先看kestrel这一部分 我们在它前面放了一个方向代理服务器n…

BZOJ 1791 岛屿(环套树+单调队列DP)

题目实际上是求环套树森林中每个环套树的直径。 对于环套树的直径&#xff0c;可以先找到这个环套树上面的环。然后把环上的每一点都到达的外向树上的最远距离作为这个点的权值。 那么直径一定就是从环上的某个点开始&#xff0c;某个点结束的。 把环拆成链&#xff0c;定义dp[…

什么是SAS

什么是SAS&#xff1f;简单的说&#xff0c;SAS是一种磁盘连接技术。它综合了现有并行SCSI和串行连接技术&#xff08;光纤通道、SSA、IEEE1394及InfiniBand等&#xff09;的优势&#xff0c;以串行通讯为协议基础架构&#xff0c;采用SCSI-3扩展指令集并兼容SATA设备&#xff…

hdu区域赛在线热身赛 暨 第十二场组队赛

题目编号&#xff1a;hdu 4257~4266 (对应比赛题号1001~1010) 这是我们第十二场组队赛&#xff0c;在今天中午进行。 比赛刚开始&#xff0c;依然是由我的队友读题。还没看几题&#xff0c;就发现了好多题judge时长高达20秒&#xff0c;这真的有点给我们心理造成压力。不过&…

powerdesign相关

1.安装程序和汉化放百度云了 2.打印错误处理 http://jingyan.baidu.com/article/c45ad29cd84e4b051753e2c3.html 3.导出sql http://jingyan.baidu.com/article/7082dc1c48960ee40a89bd38.html 4.name和comment同步 http://blog.csdn.net/steveguoshao/article/details/16940347…

Spring系列15:Environment抽象

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 本文内容 Environment抽象的2个重要概念Profile 的使用PropertySource 的使用 Environment抽象的2个重要概念 Environme…

私有化轻量级持续集成部署方案--05-持续部署服务-Drone(上)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 提示&#xff1a;本系列笔记全部存在于 Github&#xff0c; 可以直接在 Github 查看全部笔记 持续部署概述 持续部署是能…

PS图像菜单下计算命令

PS图像菜单下计算命令通过通道的混合模式得到的选区非常精细&#xff0c;从而调色的时候过度非常好。功能十分强大。 下面用计算命令中的"相加"和"减去"模式做实例解析&#xff0c;这里通道混合模式和图层混合模式原理是一样的。 原图&#xff1a; 实例目…

win10 VScode配置GCC(MinGW)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 前提 安装 Visual Studio Code安装 C/C 扩展 for VS Code 也可以在vscode的extension界面搜索’c’查找插件安装 3. 获取最…

复制构造函数的用法及出现迷途指针问题

复制构造函数利用下面这行语句来复制一个对象&#xff1a; A (A &a) 从上面这句话可以看出&#xff0c;所有的复制构造函数均只有一个参数&#xff0c;及对同一个类的对象的引用 比如说我们有一个类A&#xff0c;定义如下&#xff1a; ?12345678910class A{public:A(int i…

Linux下压缩某个文件夹(文件夹打包)

为什么80%的码农都做不了架构师&#xff1f;>>> tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子&#xff1a;把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件。 zip 压缩方法&#xff1a; 压缩当前的文件夹 zi…