POJ3185(简单BFS,主要做测试使用)

没事做水了一道POJ的简单BFS的题目

这道题的数据范围是20,所以状态总数就是(1<<20)

第一次提交使用STL的queue,并且是在队首判断是否达到终点,达到终点就退出,超时:(其实这里我是很不明白的,,TM状态总数就只有1e6怎么也不应该超时的,,,,只能说STL的queue的常数实在是太大,完全没法弄。。。)

 1 #include <map>
 2 #include <set>
 3 #include <stack>
 4 #include <queue>
 5 #include <cmath>
 6 #include <ctime>
 7 #include <vector>
 8 #include <cstdio>
 9 #include <cctype>
10 #include <cstring>
11 #include <string.h>
12 #include <cstdlib>
13 #include <iostream>
14 #include <algorithm>
15 using namespace std;
16 #define INF 1e9
17 #define inf (-((LL)1<<40))
18 #define lson k<<1, L, mid
19 #define rson k<<1|1, mid+1, R
20 #define mem0(a) memset(a,0,sizeof(a))
21 #define mem1(a) memset(a,-1,sizeof(a))
22 #define mem(a, b) memset(a, b, sizeof(a))
23 #define FOPENIN(IN) freopen(IN, "r", stdin)
24 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)
25 template<class T> T CMP_MIN(T a, T b) { return a < b; }
26 template<class T> T CMP_MAX(T a, T b) { return a > b; }
27 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
28 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
29 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
30 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;      }
31 template<class T> void SWAP(T& a, T& b) { T x = a; a = b; b = x; }
32 
33 //typedef __int64 LL;
34 typedef long long LL;
35 const int MAXN = 200010;
36 const int MAXM = 100005;
37 const double eps = 1e-10;
38 //const LL MOD = 1000000007;
39 
40 int step[1<<21];
41 bool vis[1<<21];
42 
43 int BFS(int s)
44 {
45     vis[s] = 1;
46     queue<int>q;
47     q.push(s);
48     step[s] = 0;
49     while(!q.empty())
50     {
51         int u = q.front(); q.pop();
52         if(u == 0)  return step[u];
53         for(int i=1;i<19;i++)
54         {
55             int r = u;
56             r ^= (1<<i-1) | (1<<i) | (1<<i+1);
57             if(!vis[r])
58             {
59                 vis[r] = 1;
60                 step[r] = step[u] + 1;
61                 q.push(r);
62             }
63         }
64         int r = u ^ (1<<0) ^ (1<<1);
65         if(!vis[r]) { vis[r] = 1; step[r] = step[u] + 1; q.push(r); }
66         r = u ^ (1<<18) ^ (1<<19);
67         if(!vis[r]) { vis[r] = 1; step[r] = step[u] + 1; q.push(r); }
68     }
69     return -1;
70 }
71 
72 int main()
73 {
74         //FOPENIN("in.txt");
75         int st = 0, x;
76         for(int i=0;i<20;i++)
77         {
78             scanf("%d", &x);
79             st |= (x<<i);
80         }
81         printf("%d\n", BFS(st));
82         return 0;
83 }
View Code

 

TLE后马上把判断放到队尾(就是说在一个状态进队列前先判断是不是终点状态,是的话就退出),跑了875ms,勉强过了,,(这里我就是乱改的了,代码没任何观赏性)

 1 #include <map>
 2 #include <set>
 3 #include <stack>
 4 #include <queue>
 5 #include <cmath>
 6 #include <ctime>
 7 #include <vector>
 8 #include <cstdio>
 9 #include <cctype>
10 #include <cstring>
11 #include <string.h>
12 #include <cstdlib>
13 #include <iostream>
14 #include <algorithm>
15 using namespace std;
16 #define INF 1e9
17 #define inf (-((LL)1<<40))
18 #define lson k<<1, L, mid
19 #define rson k<<1|1, mid+1, R
20 #define mem0(a) memset(a,0,sizeof(a))
21 #define mem1(a) memset(a,-1,sizeof(a))
22 #define mem(a, b) memset(a, b, sizeof(a))
23 #define FOPENIN(IN) freopen(IN, "r", stdin)
24 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)
25 template<class T> T CMP_MIN(T a, T b) { return a < b; }
26 template<class T> T CMP_MAX(T a, T b) { return a > b; }
27 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
28 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
29 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
30 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;      }
31 template<class T> void SWAP(T& a, T& b) { T x = a; a = b; b = x; }
32 
33 //typedef __int64 LL;
34 typedef long long LL;
35 const int MAXN = 200010;
36 const int MAXM = 100005;
37 const double eps = 1e-10;
38 //const LL MOD = 1000000007;
39 
40 int step[1<<21];
41 bool vis[1<<21];
42 
43 int BFS(int s)
44 {
45     vis[s] = 1;
46     queue<int>q;
47     q.push(s);
48     step[s] = 0;
49     while(!q.empty())
50     {
51         int u = q.front(); q.pop();
52         if(u == 0)  return step[u];
53         for(int i=1;i<19;i++)
54         {
55             int r = u;
56             r ^= (1<<i-1) | (1<<i) | (1<<i+1);
57             if(!vis[r])
58             {
59                 vis[r] = 1;
60                 step[r] = step[u] + 1;
61                 if(r==0) return step[r];
62                 q.push(r);
63             }
64         }
65         int r = u ^ (1<<0) ^ (1<<1);
66         if(!vis[r]) { vis[r] = 1; step[r] = step[u] + 1; q.push(r); if(r==0) return step[r];}
67         r = u ^ (1<<18) ^ (1<<19);
68         if(!vis[r]) { vis[r] = 1; step[r] = step[u] + 1; q.push(r); if(r==0) return step[r];}
69     }
70     return -1;
71 }
72 
73 int main()
74 {
75         //FOPENIN("in.txt");
76         int st = 0, x;
77         for(int i=0;i<20;i++)
78         {
79             scanf("%d", &x);
80             st |= (x<<i);
81         }
82         printf("%d\n", BFS(st));
83         return 0;
84 }
View Code

 

然后突然想起之前写过一个静态队列的模板,是用循环队列写的,想着正好去测试下,就改了队列的定义,其他使用完全一致,没任何修改,结果跑了250ms快了好多了啊有木有。。

  1 #include <map>
  2 #include <set>
  3 #include <stack>
  4 #include <queue>
  5 #include <cmath>
  6 #include <ctime>
  7 #include <vector>
  8 #include <cstdio>
  9 #include <cctype>
 10 #include <cstring>
 11 #include <string.h>
 12 #include <cstdlib>
 13 #include <iostream>
 14 #include <algorithm>
 15 using namespace std;
 16 #define INF 1e9
 17 #define inf (-((LL)1<<40))
 18 #define lson k<<1, L, mid
 19 #define rson k<<1|1, mid+1, R
 20 #define mem0(a) memset(a,0,sizeof(a))
 21 #define mem1(a) memset(a,-1,sizeof(a))
 22 #define mem(a, b) memset(a, b, sizeof(a))
 23 #define FOPENIN(IN) freopen(IN, "r", stdin)
 24 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)
 25 template<class T> T CMP_MIN(T a, T b) { return a < b; }
 26 template<class T> T CMP_MAX(T a, T b) { return a > b; }
 27 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
 28 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
 29 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
 30 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;      }
 31 template<class T> void SWAP(T& a, T& b) { T x = a; a = b; b = x; }
 32 
 33 //typedef __int64 LL;
 34 typedef long long LL;
 35 const int MAXN = 200010;
 36 const int MAXM = 100005;
 37 const double eps = 1e-10;
 38 //const LL MOD = 1000000007;
 39 
 40 
 41 //MyQueue<Type>q;
 42 //定义了一个固定长度的队列, 不能动态增长
 43     //构造时不传参数,队列大小为1e5,传入参数时为自定义大小
 44     //如果队列不为空,front返回队首元素,
 45     //如果队列为空,pop无效,front返回NULL
 46     //clear将队列清空, 供多次使用
 47     //如果push时产生冲突,即队列已满, 将加入失败
 48 template <class T>
 49 class MyQueue
 50 {
 51 private:
 52     T* que;
 53     int si, fr, re;
 54     void setValue(int _size) {
 55         fr = 0; re = 0;
 56         si = _size;
 57         que = (T*)malloc(si * sizeof(T));
 58     }
 59 public:
 60     MyQueue() {
 61         this->setValue(100005);
 62     }
 63     MyQueue(int _size) {
 64         this->setValue(_size);
 65     }
 66     T front() {
 67         if(fr != re)
 68             return que[fr];
 69         return NULL;
 70     }
 71     void pop() {
 72         if(fr != re)
 73             fr = (fr + 1) % si;
 74     }
 75     void push(T e) {
 76         if((re + 1) % si == fr) return ;
 77         que[re] = e;
 78         re = (re + 1) % si;
 79     }
 80     bool empty() {
 81         if(fr == re) return 1;
 82         return 0;
 83     }
 84     void clear() {
 85         fr = 0;
 86         re = 0;
 87     }
 88 };
 89 
 90 int step[1<<21];
 91 bool vis[1<<21];
 92 
 93 int BFS(int s)
 94 {
 95     vis[s] = 1;
 96     MyQueue<int>q(1<<21);//定义队列的大小为(1<<21),其他无任何修改
 97     q.push(s);
 98     step[s] = 0;
 99     while(!q.empty())
100     {
101         int u = q.front(); q.pop();
102         if(u == 0)  return step[u];
103         for(int i=1;i<19;i++)
104         {
105             int r = u;
106             r ^= (1<<i-1) | (1<<i) | (1<<i+1);
107             if(!vis[r])
108             {
109                 vis[r] = 1;
110                 step[r] = step[u] + 1;
111                 q.push(r);
112             }
113         }
114         int r = u ^ (1<<0) ^ (1<<1);
115         if(!vis[r]) { vis[r] = 1; step[r] = step[u] + 1; q.push(r); }
116         r = u ^ (1<<18) ^ (1<<19);
117         if(!vis[r]) { vis[r] = 1; step[r] = step[u] + 1; q.push(r); }
118     }
119     return -1;
120 }
121 
122 int main()
123 {
124         //FOPENIN("in.txt");
125         int st = 0, x;
126         for(int i=0;i<20;i++)
127         {
128             scanf("%d", &x);
129             st |= (x<<i);
130         }
131         printf("%d\n", BFS(st));
132         return 0;
133 }
View Code

 

最后试着把终点判断放在队头,依然360ms就跑出来了啊,,,我就哭了。。。

 

转载于:https://www.cnblogs.com/gj-Acit/p/3890261.html

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

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

相关文章

tomcat站点配置

tomcat版本&#xff1a;tomcat5.5.91、打开tomcat\conf\server.xml&#xff0c;在里面找到<Engine name"Catalina" defaultHost"localhost">.....</Engine>2、在<Engine name"Catalina" defaultHost"localhost"><…

新的视频会议模式:StarlineProject

目录效果展示部分用户参与度部分技术细节机械装置以及硬件配置。视频系统照明人脸跟踪压缩和传输图像渲染音频系统step1&#xff1a;捕获音频step2&#xff1a;音频去噪处理step3&#xff1a;压缩、传输、解压step4&#xff1a;渲染可以改进的点效果展示部分 〔映维网〕谷歌光场…

HDU 3934

/*这是用的有旋转卡壳的思想。 首先确定i&#xff0c;j&#xff0c;对k进行循环&#xff0c;知道找到第一个k使得cross(i,j,k)>cross(i,j,k1),如果ki进入下一次循环。 对j&#xff0c;k进行旋转&#xff0c;每次循环之前更新最大值&#xff0c;然后固定一个j&#xff0c;同样…

[ios] UILocalNotification实现本地的闹钟提醒【转】

http://www.cnblogs.com/jiangshiyong/archive/2012/06/06/2538204.html转载于:https://www.cnblogs.com/jinjiantong/archive/2013/04/01/2992624.html

sql server根据表中数据生成insert语句

几个收藏的根据数据库生成Insert语句的存储过程[修正版]----根据表中数据生成insert语句的存储过程--建立存储过程&#xff0c;执行spGenInsertSQL 表名--感谢playyuer----感谢szyicol--CREATEproc[dbo].[spGenInsertSQL](tablenamevarchar(256))asbegindeclaresqlvarchar(8000…

Javascript eval()函数 基础回顾

如果您想详细了解ev al和JSON请参考以下链接&#xff1a; eval &#xff1a;https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval JSON&#xff1a;http://www.json.org/ eval函数的工作原理 eval函数会评估一个给定的含有JavaScript代码的…

杂感无题|

今天中午和组里面的人吃饭&#xff0c;聊起了科兴跳楼的事情。这事其实前几天我华为的mentor就转给我了&#xff0c;当时也没太在意&#xff0c;在脉脉上看了看&#xff0c;也不知晓是谁&#xff0c;想着可能又是抑郁症吧。 饭后依旧绕着食堂散步&#xff0c;ly说那个人好像还是…

uva1366_Martian Mining_简单DP

题目不难&#xff0c;却想了好长时间&#xff0c;目测自己DP还是很水。。。囧 思路&#xff1a;舍f[i][j]为前i行j列的最大矿总量不难推出状态转移方程为f[i][j]max(f[i-1][j]line[i][j],f[i][j-1]row[j][i]) 其中line[i][j]为第i行前j个A矿的和&#xff08;a[i][1]a[i][2]...a…

数学图形之Boy surface

这是一个姓Boy的人发现的,所以取名为Boy surface.该图形与罗马图形有点相似,都是三分的图形.它甚至可以说是由罗马曲面变化而成的. 本文将展示几种Boy曲面的生成算法和切图,使用自己定义语法的脚本代码生成数学图形.相关软件参见:数学图形可视化工具,该软件免费开源.QQ交流群: …

开个定时器给echarts组件配置定时更新

我在js文件中开了个定时器&#xff0c;每1s从后端获取数据并解析&#xff0c;然后用异步方法就渲染不出来&#xff0c;改成同步就可以了。 这个解决方法来自于这篇文章&#xff0c;我出的问题和他一样&#xff1a;关于ajax中readyState的值一直为1的问题 这里将ajax参数修改为f…

SDK 操作 list-view control 实例 -- 遍历进程

遍历窗口&#xff0c;获得控件句柄 1 EnumChildWindows(hwndDlg, (WNDENUMPROC)EnumChildProc, NULL); 回调函数 1 BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam )2 {3 char strCLSName[MAXBYTE] {0};4 GetClassName(hwnd, strCLSName, MAXBYTE);5 if (…

推荐一份不错的清除默认样式的CSS样式

时间过得真快&#xff0c;离 Reset CSS 研究&#xff08;八卦篇&#xff09; 已经 3 个多月了。废话少说&#xff0c;赶紧将技术篇写完吧。 回顾与反思 第一份 reset css 是 Tantek 的 undohtml.css, 很简单的代码&#xff0c;Tantek 根据自己的需要&#xff0c;对浏览器的默认…

python深浅拷贝

在python中&#xff0c;对象赋值实际上是对象的引用。当创建一个对象&#xff0c;然后把它赋给另一个变量的时候&#xff0c;python并没有拷贝这个对象&#xff0c;而只是拷贝了这个对象的引用。 所以一个结构类型被赋给另外一个对象的时候&#xff0c;尽可能不使用 &#xff…

Flash中的SLC/MLC/MLC--基础

参考 1.http://www.upantool.com/jiaocheng/qita/2012/slc_mlc_tlc.html 2.http://www.2ic.cn/html/10/t-432410.html 3.http://kms.lenovots.com/kb/article.php?id15382 4.http://www.albertknight.com/222.html 5.http://ssd.zol.com.cn/371/3716632.html 6.这个图比较多 h…

python定义对象的比较方法

有时候我们需要比较两个对象。比如哪个对象大,哪个对象小。如果我们不告诉python如何比较,那么Python是不知道如何进行比较的。 下面提供实例 #__eq__(self,other)&#xff1a; #在使用比较运算符比较两个对象是否相等的时候会调用这个方法。 #如果是相等&#xff0c;那么应该返…

关于Oracle Insert 语句的子查询 和 with check option的用法

今日睇ocp教程 发现 insert语句还可以子查询例如&#xff1a;INSERT INTO (SELECT employee_id, last_name, email, hire_date, job_id, salary, department_id FROM employees where department_id 50 )VALUES (9999…

apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard

apple mac 下使用机械键盘的办法&#xff0c;键盘映射工具软件&#xff0c;apple mac Mechanical keyboard 想在苹果电脑 mac 系统下使用 机械键盘&#xff0c;大部分机械键盘不是为mac设计的&#xff0c;所以需要用软件做一下键盘映射。 推荐使用这个&#xff1a;https://pqrs…

Python中键映射多个值的方法:defaultdict

Python中键映射多个值的方法有两种&#xff1a; 想保持元素的插入顺序就应该使用列表&#xff1b; 想去掉重复元素就使用集合并且不关心元素的顺序问题的话应该使用set from collections import defaultdictmapping defaultdict(list)mapping [key].append(value)mapping d…

该不该让Google收录WordPress的目录页和标签页?

只要有一点SEO知识的 站长都会注意利用相关文件和元标签来控制Google对网站的收录&#xff0c;对于WordPress网站来说&#xff0c;除了我们主动添加的内容页面&#xff0c;Google还会收录目录归档页&#xff0c;标签归档页&#xff0c;时间归档页&#xff0c;以及作者归档页。这…

【原创】MapReduce编程系列之表连接

问题描述需要连接的表如下&#xff1a;其中左边是child&#xff0c;右边是parent&#xff0c;我们要做的是找出grandchild和grandparent的对应关系&#xff0c;为此需要进行表的连接。 Tom Lucy Tom Jim Lucy David Lucy Lili Jim Lilei Jim SuSan Lily Green Lily Bians Green…