首页 > 学院 > 开发设计 > 正文

广度优先搜索练习之神奇的电梯

2019-11-08 03:24:54
字体:
来源:转载
供稿:网友

think: 1题目一开始自己使用邻接表来做,结果就是样本数据和自己思考的数据都可以通过,但是提交之后就是wrong answer,之后在博客上借鉴可前辈们的代码,使用了邻接矩阵来做,然后又wrong answer了,内心崩溃临界状态,然后对照前辈代码,发现自己因为vis数组开的小了,按照题意至少应该200+,可自己只开了104,因此修改之后提交就AC了,感觉可能是因为进度有点被别的同学拉下了,所以内心焦急,还得多学会调节自己和提高效率,只有这样才能从根本上解决问题,心态调节与提高效率是相辅相成的关系,自己既要学会更适合自己的学习方法,因为自己就是变化的,所以最合适的方法至少也是在一个轻微的细节不断变化,学习心态,学习效率,学习方法,都得加油提高,只要自己不放弃,那便没有真正意义上的失败,失败只是成功的前奏,只要坚持和反思,失败不再持续可怕 2回归题目,其实自己感觉这个题目虽然数据量并不大,但感觉还是使用邻接表比较适合,因为数据的输入方式很适合建立邻接表,而邻接表对于查询操作来说时间复杂度要优于邻接矩阵,广度优先搜索,自己在这个题目的收获就是其实可以直接把需要初始化数组的初始化直接放在BFS函数中,这样更适合一次输入,多次查询的任务需求,还有自己之前基本都是把第一个的数据初始化放在BFS函数外面,自己这次是直接放在BFS函数中,这样感觉整体上简洁明了许多,再就是全局变量的使用,之前做图的题目的时候一直没有考虑的全局变量方面的反思,这次注意到就简单反思一下,在很多优先变量的输入中其实可能会在多个函数中使用,如果一直使用实参传递给形参感觉可能会比较略显繁琐,使用多个函数的时候就可以考虑将优先变量使用为全局变量,但是却一定要注意不能在函数中出现重名,之前自己就犯过这样的错误,所以全局变量不能随便就用,要有计划的使用,而且在CodeBlocks里面,至少自己调试bug的时候似乎watch窗口并不显示全局定义的变量,那时候就得自己推演全局变量的变化 3基于结构体数组的队列思想

sdut原题链接

广度优先搜索练习之神奇的电梯 Time Limit: 1000MS Memory Limit: 65536KB

PRoblem Description 有一座已知层数为n的高楼,这座高楼的特殊之处在于只能靠电梯去上下楼,所以要去到某一层要非常耽误时间,然而更悲哀的是,这座高楼的电梯是限号的,小鑫最开始的时候在1层,他想去第x层,问题是他最起码要经过多少层(包含第x层)才能到达第x层。

Input 多组输入。 第一行是三个正整数n,m,q。分别代表楼的总层数,给定的m条信息和q次查询。 接下来的m行,每行的第一个整数pos代表这是第pos层的电梯,第二个数代表从这一层可以去的楼层总共有num个,之后的num个数字代表从第pos层代表可以去的楼层。 最后的q行,每行一个整数代表小鑫想去的楼层号码。 1<=m,pos,num<=n<=200 1<=q<=20

Output 对于每次询问输出一个整数,占一行。代表如果要去某个楼层最少要经过多少层,如果到不了的话就输出-1。

Example Input 10 4 3 1 2 6 7 3 4 4 6 8 10 5 2 2 3 7 3 10 5 6 4 5 9

Example Output 5 3 -1

Hint BFS+邻接矩阵(个人建议)

Author Casithy

以下为accepted代码——BFS+邻接矩阵

#include <stdio.h>#include <string.h>struct node{ int x; int size;}link[204], t, f;int tp, op, n;int map[204][204], vis[204];void BFS(int x1, int X){ memset(vis, 0, sizeof(vis)); memset(link, 0, sizeof(link)); tp = op = 0; t.x = 1; t.size = 0; link[tp++] = t; vis[t.x] = 1; while(op < tp) { f = link[op++]; if(f.x == X) { printf("%d/n", f.size + 1); return; } for(int i = 1; i <= n; i++) { if(map[f.x][i] == 1 && vis[i] == 0) { t.x = i; t.size = f.size + 1; link[tp++] = t; vis[i] = 1; } } } printf("-1/n");}int main(){ int m, q, u, num, v, X; while(scanf("%d %d %d", &n, &m, &q) != EOF) { memset(map, 0, sizeof(map)); while(m--) { scanf("%d", &u); scanf("%d", &num); while(num--) { scanf("%d", &v); map[u][v] = 1; } } while(q--) { scanf("%d", &X); BFS(1, X); } } return 0;}/***************************************************User name: Result: AcceptedTake time: 16msTake Memory: 276KBSubmit time: 2017-02-17 09:49:38****************************************************/

以下为wrong answer代码——BFS+邻接表 .???

#include <stdio.h>#include <string.h>#include <stdlib.h>struct node{ int Data; struct node *next;}*map[204], *p;struct node1{ int x; int size;}link[204], ans, t, f;int vis[204];int tp, op;void BFS(int x1, int X){ ans.x = x1; ans.size = 1; link[tp++] = ans; while(op < tp) { t = link[op++]; if(t.x == X) { printf("%d/n", t.size); return; } p = map[t.x]; while(p != NULL) { if(vis[p->Data] == 0) { f.x = p->Data; f.size = t.size + 1; link[tp++] = f; vis[p->Data] = 1; } p = p->next; } } printf("-1/n");}int main(){ int n, m, i, q, u, num, v, X; while(scanf("%d %d %d", &n, &m, &q) != EOF) { for(i = 0; i < n; i++) map[i] = NULL; while(m--) { scanf("%d", &u); if(map[u] == NULL) { p = (struct node *)malloc(sizeof(struct node)); p->Data = u; p->next = NULL; map[u] = p; } scanf("%d", &num); while(num--) { scanf("%d", &v); p = (struct node *)malloc(sizeof(struct node)); p->Data = v; p->next = NULL; p->next = map[u]->next; map[u]->next = p; } } while(q--) { scanf("%d", &X); tp = op = 0; memset(vis, 0, sizeof(vis)); memset(link, 0, sizeof(link)); BFS(1, X); } } return 0;}/***************************************************User name: Result: Wrong AnswerTake time: 32msTake Memory: 3000KBSubmit time: 2017-02-17 09:12:20****************************************************/
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表