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,一经查实,立即删除!

相关文章

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

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

杂感无题|

今天中午和组里面的人吃饭&#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…

关于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…

ORACLE基本SQL语句-查询篇

一、普通查询 /*查询表数据*/select * from STU /*取出前3行数据*/select * from stu where ROWNUM<3 /*模糊查询*/select * from stu where stu_id like stu001% 说明&#xff1a;通配符“%”代表一个或者多个字符&#xff0c;通配符“_”代表一个字符。 /*别名*/select S…

三次握手建立失败的几种情况以及三次握手的理解

上面的图是阻塞式socket进行通信的过程&#xff0c;阻塞的时候是操作系统内核网络协议栈在工作 调用 connect 函数将激发 TCP 的三次握手过程&#xff0c;而且仅在连接建立成功或出错时才返回。其中出错返回可能有以下几种情况&#xff1a; 1、三次握手无法建立&#xff0c;客…

在熟练使用2B铅笔前,请不要打开Axure

在互联网产品领域&#xff0c;Axure已成为产品经理、产品设计师以及交互设计师的必备工具&#xff0c;从某种程度讲&#xff0c;Axure帮助我们建立低保真模型&#xff0c;便于与用户的需求验证&#xff0c;也帮助我们构思交互细节&#xff0c;使前端和开发人员更容易理解我们的…

启用isqlplus

iSQL*Plus是sqlplus基于web方式发布的&#xff0c;要使用它只要在服务器上开启即可&#xff1a; [oraclelocalhost ~]$ isqlplusctl start perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE (unset), LC_ALL (unset)…

echarts 怎么知道鼠标点击的哪根柱子

有个需求&#xff0c;点击柱子&#xff0c;然后得到该柱子的信息&#xff0c;然后展示这个机房的时序图。 第一步卡住了&#xff0c;就是不知道如何获取柱子的序号。后参考&#xff1a;https://blog.csdn.net/zt_fucker/article/details/72461572?utm_sourceblogxgwz1 得到思路…

codeforces 261 D

题目链接&#xff1a; 解题报告&#xff1a;给出一个序列a1,a2,a3.........an&#xff0c;f(i , j ,x) ak 等于x的个数(i < k < j)&#xff0c;令i < j&#xff0c;求有多少对 i 和 j 使得 f(1,i,ai) > f(j,n,aj)。 从左往右扫一遍这个序列&#xff0c;num1[i] 等于…

不使用物理引擎,自己动手做真实物理的模拟投篮游戏

最近打算做一个2D投篮游戏&#xff0c;由于对于BOX2D等物理引擎并不熟悉&#xff0c;加之一开始低估了游戏所需要的碰撞检测复杂度&#xff0c;认为仅仅涉及4面墙&#xff0c;篮球&#xff0c;篮板&#xff0c;篮筐&#xff0c;篮网的碰撞检测并不复杂。因此决定自己实现所需要…

nyist 488 素数环

有一个整数n&#xff0c;把从1到n的数字无重复的排列成环&#xff0c;且使每相邻两个数&#xff08;包括首尾&#xff09;的和都为素数&#xff0c;称为素数环。 为了简便起见&#xff0c;我们规定每个素数环都从1开始。例如&#xff0c;下图就是6的一个素数环。 这题在进行判断…

.Net入门-部署问题

学习一门新的语言难免会遇到各种各样的问题&#xff0c;总结一下。 测试环境&#xff1a;windows2008serverIIS7 开发环境: vs2010 问题1&#xff1a;"Unrecognized attribute targetFramework. Note that attribute names are case-sensitive. " 分析&#xff1a; 开…

WINDOWS系统Eclipse+NDK+Android + OpenCv

WINDOWS系统EclipseNDKAndroid OpenCv 参考文档博客 1 NDK环境搭建 http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html 2 官方文档 Android.mk与Application.mk如何编写&#xff0c;OpenCV库如何调用 http://docs.opencv.org/trunk/doc/tutorials/introduction…

正确理解JavaScript

过去几年我注意到技术圈一个很奇怪的现象&#xff0c;有太多程序员将那些他们只是有过非常浅显的了解&#xff0c; 但其实根本就不懂的技术写到他们的简历中&#xff0c;这个现象几乎每种语言都有&#xff0c;但这其中最严重的就要数javascript了。 你不知道你不懂 出现这种状况…

医疗机构远程视频监控集中管理,贝锐蒲公英提供一站式解决方案

上海某企业专业致力于医疗软件、家居智能化研发、设计、销售、集成及实施&#xff0c;企业主营业务之一为医疗软件&#xff0c;涉及PACS/RIS/WEB/HIS、示教系统等方面的医院信息化建设。 在实际应用、部署过程中&#xff0c;需要实现各地区分院与总院间的数据库互相访问、视频数…

JAVA_Collection容器

因为项目的需要&#xff0c;今天抽时间把JAVA中的容器复习了一下&#xff0c;为了以后的不时之需&#xff0c;现在把它记下来。 容器有其名&#xff0c;知其意&#xff0c;用来盛放数据的集合&#xff0c;JAVA中为我们提供了三种容器类&#xff1a;set、list、map&#xff0c;三…