随笔分类 - 搜索_BFS
摘要:Borg Maze大意:给你一个m*n的迷宫,可以上下左右的走,只能走空格或字母,求出将所有字母连通起来的最小耗费。思路:先用BFS求出S到所有A的距离,再用Prim求最小生成树,求出最小耗费。这个题坑的不在题,是数据太坑了,在空格处理上没弄好,贡献了好几个WA和CE,看Discuss才知道很坑,最后用G++过了的代码,C++还RE,实在不知道说什么好了 =。= 1 #include 2 #include 3 #include 4 #define INF 0xfffffff 5 using namespace std; 6 7 char str[55][55]; 8 i...
阅读全文
摘要:Pots大意:给你两个碗,三种操作,看多少步能凑出给你的容量。思路:六入口的BFS,难点主要是在记录路径打印上,只要再开一个数组,记录一下前驱,最后按顺序打印即可。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 int vis[110][110]; 9 int a, b, c; 10 11 struct node 12 { 13 int x, y, step; 14 } ; 15 16 struct Path 17 { 18 i...
阅读全文
摘要:Prime Path大意:给你两个数,求从第一个数经过几次变换到第二个数。变换要求:1.中间数必须是素数 2.每次只能变一个数字。思路:对每一位数字进行bfs 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define LL long long 11 #define min(a,b) (a>b?b:a) 12 #define max(a,b) (a>b?a:b) 13 #define eps 1e-...
阅读全文
摘要:Dungeon Master大意:给你一个三维的地图,可以上下左右前后的运动,求从‘S’到‘E’的对短距离。思路: 训练计划上说是DFS,敲着敲着发现敲不动了,就BFS了。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 int Map[35][35][35]; 8 int s_x, s_y, s_z; 9 int b_x, b_y, b_z; 10 int e_x, e_y, e_z; 11 bool dis[35][35][35]; 12 int ans[300000]...
阅读全文
摘要:Finding Nemo大意:有一个迷宫,在迷宫中有墙与门有m道墙,每一道墙表示为(x,y,d,t),x,y表示墙的起始坐标d为0即向右t个单位,都是墙d为1即向上t个单位,都是墙有n道门,每一道门表示为(x,y,d),x,y表示门的起始坐标d为0即向右一个单位表示门d为1即向上一个单位表示门再给出你起点的位置(f1,f2),并保证这个点的位置不会再墙或者门中,为起点到(0,0)最少要穿过多少条门思路:将坐标系看成网格,在这里我以每个格子的左下点为基点,那么坐标对应网格坐标(0,0)的网格为(1,1)坐标(1,1)的网格为(2,2)坐标(1,2)的网格为(2,3)...依次类推我再定义X[i]
阅读全文
摘要:BFS 判断可达性 邻接vector存储 1 # include 2 # include 3 # include 4 # include 5 # include 6 # define N 1010 7 using namespace std; 8 9 bool vis[N];10 vectorG[N];11 12 void add(int u, int v)13 {14 G[u].push_back(v);15 }16 17 bool BFS(int s)18 {19 queueq;20 q.push(s);21 vis[s] = true;22 ...
阅读全文
摘要:基于邻接矩阵的BFS: 1 # include 2 # include 3 # include 4 # include 5 # include 6 # define N 1010 7 using namespace std; 8 9 int map[N][N];10 int vis[N], p[N];11 queueq;12 int t = 0, n;13 14 void BFS(int s)15 {16 vis[s] = 1;17 for(int i = 0; i > o;38 while(o--)39 {40...
阅读全文
摘要:题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色。游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完成了。现在给定一个初始状态,要求输出能够完成游戏所需翻转的最小次数,如果初始状态已经达到要求输出0。如果不可能完成游戏,输出Impossible。主要思想:1.如果用一个4*4的数组存储每一种状态,不但存储空间很大,而且在穷举状态时也不方便记录。因为每一颗棋子都只有两种状态,所以可以用二进制0和1表示每一个棋子的状态,则棋盘的状态就可以用一个16位的整数唯一标识。而翻转的操作也可以通过通过位操作来
阅读全文

浙公网安备 33010602011771号