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 }

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 }

然后突然想起之前写过一个静态队列的模板,是用循环队列写的,想着正好去测试下,就改了队列的定义,其他使用完全一致,没任何修改,结果跑了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 }

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

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

时间: 2024-10-10 04:09:19

POJ3185(简单BFS,主要做测试使用)的相关文章

【微信转载】Google是如何做测试的

就 目前的软件公司而言,Google无疑是在开放和创新力方面做得最好的.而如何支撑Google这种快速地扩张的研发能力以及迭代速度,并且产品质量总是 一如以往的能给人们很棒的用户体验?这是一个值得我们思考和学习的问题,怎么保持快速地产品开发,当然离不开高效的测试. 下面,参考这篇文章"Google是如何做测试的",其实除了这篇文章之外,当然更推荐另一本书<Google测试之道>. 导读:本文译自 James Whittaker 在 Google 测试官方博客发表的文章<

【POJ 3669 Meteor Shower】简单BFS

流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封锁).安全地带为永远不会被封锁的点. 简单bfs,开始WA在把平面空间上限当成300*300,但根据题目,这只是有流星雨撞击的范围.实际可走的空间理论上没上限,但分析可得,离原点最近的安全地带一定在(302,302)范围内,所以应可把数组至少开为303*303. 后来WA在把G[0][0]==1的情

传统的那些测试都是狗屎!无能的人做测试只能采用那些苟且的做法V2!

传统的测试,手段很多,但是基本思想只有一个,那就是弱智无能的:万箭齐发- 所有的测试动作,都是盲目的“覆盖”!这种做法实在太愚蠢啊- 测试的过程,基本是一个固定不变的傻逼流程,其中涉及各种文档.各种假动作.各种装模作样的会议,其实没有人懂自己在干什么! 这个傻逼流程之所以傻逼,是因为低效实在太低太低太低! 通常这个傻逼流程会以需求等表面东西为出发点,设计测试用例在需求等最表面的一层进行覆盖:同时妄想通过对这一层的覆盖达到对整个质量的保证,多么可爱又可笑啊,白日梦做了这么多年都醒不过来-!岂不知质

刚做测试工作一年的时候,我是怎样的?

刚落笔前,我想了好久,该如何诠释这段经历. 也许你现在也和我当时一样,但是,相信我,北京是个有实力说话的好地方,所以让努力擦亮自己,让自己的光显得格外抢眼. 时光仿佛又定格在我刚入京那一刻,一切是那么亲切而熟悉,有我喜欢的路边摊,喜欢的天桥及凌晨灯火通明的静谧,更有我难忘的恩师和朋友,一切的一切都是的那么美好而令人难忘…… 关于租房 刚到北京那会,北京的租房价格,比我想象的要贵好多,而且难以接受,二手房东比我想象中的套路多,重点是被骗过.我和两个小伙伴一起来的北京,来了第三天后,他们都因房子太贵

微信平台开发之利用本地环境加新花生壳解释做测试环境

准备工作: 1.搭建本地PHP开发环境. 2.注册并安装新花生壳. 3.注册微信公众平台帐号. 第一步:搭建本地PHP开发环境,案例使用wamp集成环境. 下载并安装集成环境确保集成环境正常运行. 第二步:注册并安装新花生壳,过程(略). 具体教程可查看http://www.oray.com/ 第三步:对开发环境做解释. 登陆花生壳做解释: 开放wamp的外部访问:教程http://hi.baidu.com/aubbll/item/8bd5a52253d3ecd7a517b685 至此,外网就可

我在Thoughtworks是如何做测试的 (二)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545; min-height: 14.0px } li.li1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px &quo

想做测试经理的看过来

当你来到公司的第一天,他就是你今天要找的人.刚挂掉找寻的电话,略微寒暄,就开始帮你安排座位,安排带教人,带你熟悉工作环境……一切都那么井井有条.这,大约就是对测试经理这个职位的第一印象了.工作后慢慢发现,他控制着测试组接哪些需求,会跟进每个项目的进度,去开有大领导在的会议,也时常找人单独谈话,组织每周的部门例会,还会定时告诉你的绩效.这个职位的薪水也是个谜,听说会比测试高一点,工作却没有测试那么忙,不用写用例,也不用测试,就是要承担项目的风险.刚进入测试行业的我,觉得测试经理是份不错的美差. 怎

POJ 3278 Catch That Cow --- 简单BFS

/* POJ 3278 Catch That Cow --- 简单BFS */ #include <cstdio> #include <queue> #include <cstring> using namespace std; const int maxn = 100005; bool visit[maxn]; int step[maxn]; int bfs(int n, int k){ if (n == k) return 0; memset(visit, 0, s

双apache + php + nfs + mariadb 配置 以discuz做测试

实验目标: 1,两台前端apache和php都挂载nfs文件系统中的php程序. 2,mysql 为单独一台服务器,为php页面程序提供数据库存储 3,静态页面文件都放在nfs服务器上 4,需要dns轮循为两台前端服务器分配访问请求 缺点: 压力都在文件存储服务器上 优点:不用考虑两台web服务器静态页面一致性的问题. 操作大体步骤: 1,两台web服务器:挂载nfs.编译安装apache,添加支持fcgi协议的模块,把php请求都代理到php服务器,站点根目录为挂载的文件.根据实际情况调整进程