WAP 2014 Examination 1

有两个考试,选了第1个。

题目的意思是W*H的方格,从S点到G点,中间要经过所有的n个checkpoint,求最短路。其中有的点不能走。

如果没有checkpoint的话,一个BFS就可以了。最开始想到贪心,从S开始,每次选择最近的那个点,但很容易找出反例来。

后来想,题目无非就是在S和G中安排n个点,以一定的次序使得依次连起来之后路径长度最短,因此一次添加一个点,假设之前已经安排好k个点,新加的点一共有k+1个位置可选。从这些可选点中选择最优解。但又找到了反例。

于是想到了动态规划,dp[i][j]表示已经选好了前i-1个点,选择j作为下一个添加的点的最优解。

令S为0,1到n位CP点,n+1为G点,于是dp[i][j]=min(dp[i-1][k]+dis[k][j],k从0到n)。需要注意的是要保证前i-1个点中没有j。最多18个CP,可以用一个整形(32位)来保存已经选择的点。还有一个需要注意的是k是从0到n,而不是到n+1,因为前i-1个点中不能有G点。

开始时对每个点BFS求任意两个点之间的最短路。


  1 #include<stdlib.h>
2 #include<iostream>
3 #include<stdio.h>
4 #include<string.h>
5 #include<vector>
6 #include<list>
7 #include<queue>
8 #include<sstream>
9 #include<map>
10 #define inf 0x7fffffff
11 #define LL long long
12 #define MAX_E 1000000
13 #define MAX_V 500
14 #define MAX_N 105
15 using namespace std;
16 char mat[MAX_N][MAX_N];
17 int bit[MAX_N][MAX_N];
18 //对应坐标是否有CP
19 int pos[MAX_N][MAX_N];
20 int dis[MAX_N][MAX_N];
21 int dp[MAX_N][MAX_N];
22 int n=0;
23 int W,H;
24 struct Pos{
25 int h,w;
26 int levle;
27 Pos(){
28 h=w=levle=0;
29 }
30 Pos(int _h,int _w,int _levle){
31 h=_h;
32 w=_w;
33 levle=_levle;
34 }
35 };
36 int dh[4]={-1,0,1,0};
37 int dw[4]={0,1,0,-1};
38 void bfs(int h,int w){
39 int s=pos[h][w];
40 dis[s][s]=0;
41 Pos start(h,w,0);
42 queue<Pos> q;
43 q.push(start);
44 bool visited[MAX_N][MAX_N];
45 memset(visited,0,sizeof(visited));
46 visited[h][w]=1;
47 while(!q.empty()){
48 Pos t=q.front();
49 q.pop();
50 for(int i=0;i<4;i++){
51 int hh=t.h+dh[i],ww=t.w+dw[i];
52 //非墙壁
53 if(hh>=0&&hh<H&&ww>=0&&ww<W&&mat[hh][ww]!=‘#‘&&!visited[hh][ww]){
54 Pos add(hh,ww,t.levle+1);
55 q.push(add);
56 visited[hh][ww]=1;
57 int p=pos[hh][ww];
58 if(p>=0&&dis[s][p]==inf){
59 dis[s][p]=add.levle;
60 }
61 }
62 }
63 }
64 }
65 void solve(){
66 //初始化起点,终点和CP点的位置
67 //0为起点,1..n为CP点,n+1为终点
68 n=0;
69 memset(pos,-1,sizeof(pos));
70 for(int i=0;i<H;i++){
71 for(int j=0;j<W;j++){
72 if(mat[i][j]==‘@‘){
73 pos[i][j]=++n;
74 }
75 }
76 }
77 for(int i=0;i<H;i++){
78 for(int j=0;j<W;j++){
79 if(mat[i][j]==‘S‘){
80 pos[i][j]=0;
81 }
82 if(mat[i][j]==‘G‘){
83 pos[i][j]=n+1;
84 }
85 }
86 }
87 //
88 for(int i=0;i<=n+1;i++)
89 {
90 fill(dis[i],dis[i]+n+2,inf);
91 }
92 for(int i=0;i<H;i++)
93 for(int j=0;j<W;j++){
94 if(pos[i][j]>=0)
95 bfs(i,j);
96 }
97 for(int i=0;i<=n+1;i++)
98 fill(dp[i],dp[i]+n+2,inf);
99 memset(bit,0,sizeof(bit));
100 dp[0][0]=0;
101 bit[0][0]=1;
102 for(int i=1;i<=n+1;i++){
103 for(int j=1;j<=n+1;j++){
104 int M=inf,t=-1;
105 //注意,这里不能到n+1,第1到n步不能包含G
106 //若包含,在考虑最后一个点时,若前n个里均已包含G点,则此时求出的值为无穷大
107 for(int k=0;k<=n;k++){
108 if(dp[i-1][k]!=inf&&(bit[i-1][k]&(1<<j))==0)
109 if(M>dp[i-1][k]+dis[k][j]){
110 M=dp[i-1][k]+dis[k][j];
111 t=k;
112 }
113 }
114 if (t!=-1) {
115 dp[i][j]=M;
116 bit[i][j]=bit[i-1][t]|(1<<j);
117 }
118 }
119 }
120 cout<<dp[n+1][n+1]<<endl;
121 }
122 class Orienteering{
123 public:
124 void main();
125 };
126 void Orienteering::main(){
127 while(scanf("%d%d",&W,&H)!=EOF){
128 getchar();
129 for(int i=0;i<H;i++)
130 scanf("%s",mat[i]);
131 solve();
132 }
133 }
134 int main(int argc, char* argv[]) {
135 Orienteering o;
136 o.main();
137 return 0;
138 }

提交之后才发现题目要求图不符合要求和不能到达终点时输出-1,%>_<%没处理

WAP 2014 Examination 1,布布扣,bubuko.com

时间: 2024-11-16 14:34:12

WAP 2014 Examination 1的相关文章

2014年最热门的国人开发开源软件TOP100

2014年最热门的国人开发开源软件TOP100 不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是开源不可忽视的力量. 而我们这个榜单也是从这些国人开发.主要参与开发或者基于国外开源软件进行改进并形成独立版本的软件中,根据该软件的访问.收藏.下载等多个角度,从而得出前 100 名最受欢迎的开源软件.我们所评选出来的软件并非同类型,尽管放在一起不是很

Debian/Ubuntu Linux:使用Hostapd搭建无线访问点(WAP)

NIXCRAFT发表于2012年8月25日,在2014年7月9日更新,适用DEBIAN / UBUNTU, 网络, UBUNTU LINUX, 无线网络. 我们有个闲置的USB无线适配器(WIFI适配器),而我们的ISP路由器却是有线的.怎样把我们的家庭NAS服务器变成无线访问点(WAP),在不用买额外的WPA盒子的情况下,在Debian或Ubuntu系统下使用无线设备访问到它? 你需要使用hostapd作为访问点和认证服务器.它实现了IEEE 802.11访问点管理,IEEE802.1X/WP

利用Selenium自动化测试android wap页

http://blogs.360.cn/360qtest/2014/04/01/%E5%88%A9%E7%94%A8selenium%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95android-wap%E9%A1%B5/ 针对智能手机端的应用的自动化测试,目前主要分两类:一是基于APP的apk自动化测试,二是浏览器的wap页测试.目前做的较多的是第一种情况,应用的自动化测试框架也较多,如NativeDriver.Robotium.calabash等:而

用Selenium自动化测试android wap页面

利用Selenium自动化测试android wap页面:http://blogs.360.cn/360qtest/2014/04/01/%E5%88%A9%E7%94%A8selenium%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95android-wap%E9%A1%B5/

2014年国人开发的最热门的开源软件TOP 100

不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是开源不可忽视的力量. 而我们这个榜单也是从这些国人开发.主要参与开发或者基于国外开源软件进行改进并形成独立版本的软件中,根据该软件的访问.收藏.下载等多个角度,从而得出前 100 名最受欢迎的开源软件.我们所评选出来的软件并非同类型,尽管放在一起不是很科学,但我们仍希望通过我们的视角让大家对国内一些

ShopNC【B2B2C】多用户电商平台系统,带WAP,微商城,圈子,门户

<ShopNC[B2B2C]多用户电商平台系统,带WAP,微商城,圈子,门户> 早上发了套ShopNC B2B2C多用户商城2014商业版,带微商城,但不带圈子.WAP.圈子和门户,现在发的这套貌似功能更强悍些,在这里再次分享下,不少童鞋都在找这种类型的源码. 效果演示图为我们亲测截图,下载安装以后和这里演示截图一样,更多详细请下载后自己慢慢研究 安装说明 空间需要支持php+mysql 执行shopnc的安装程序,打开http://你的网址/shop/install  按照提示完成安装即可,

2014马哥Linux0217中对0214三题的解答

前几天在做2014马哥Linux0214的作业的时候,发现其实这三题在0217中有解答,当然觉得马哥比自己写得好太多,所以忍不住要把马哥的答案贴出来,以供自己学习. 第一题:写一个脚本,用for循环实现显示/etc/init.d/functions./etc/rc.d/rc.sysinit./etc/fstab有多少行 #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab;do line

【国家统计局】2013年6月份-2014年5月份70个大中城市住宅销售价格变动情况

2014年5月份70个大中城市住宅销售价格变动情况 http://www.stats.gov.cn/tjsj/zxfb/201406/t20140618_569655.html (一)与上月相比,70个大中城市中,价格下降的城市有35个,持平的城市有20个,上涨的城市有15个.环比价格变动中,最高涨幅为0.3%,最低为下降1.4%. (二)与去年同月相比,70个大中城市中,价格下降的城市有1个,上涨的城市有69个.5月份,同比价格变动中,最高涨幅为11.3%,最低为下降4.8%. -------

[IDE工具配置]myeclipse 2014 专业版 安装 svn插件

团队合作的项目肯定少不了版本控制,那么现在就看看myeclispe中是如何使用的吧. 开发环境:myeclipse 2014   java 8 tomcate 8 试了网上说的几种方法,都没有成功,最终自己还是摸索着弄出来了,这里先记录一下,后期自己再配置的时候好获取路径啥的. 打开myeclipse的help---install from site 点击add弹出对话框 在输入框中输入对应内容 http://subclipse.tigris.org/update_1.10.x 点击OK之后,会