10047 - The Monocycle(BFS +状态判断)

2024-08-24 04:48

本文主要是介绍10047 - The Monocycle(BFS +状态判断),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:10047 - The Monocycle


题目大意:还是迷宫问题,只是这次有要求方向和轮子着地的颜色。


解题思路:BFS ,但是需要判断状态, 并且一个格子不在是走过一次就不可以走了,而是要判断走过这个格子的轮子的方向啊,颜色啊,所以那个是否走过格子的数组是四元数组,刚开始没有想到这个,不知道到了终点后颜色不符合要求该怎么办,后面看了别人的代码,才发现可以都遍历一遍,看看有没有符合要求的最短的。剩下的就是要细心了,这题很麻烦。


#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;const int N = 30;
int r, c, t;
char map[N][N];
int visit[4][5][N][N], time;struct M {int x, y, dre, cor, time;
};int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};queue<M> q;int bfs(M x) {visit[x.dre][x.cor][x.x][x.y] = 1;q.push(x);while(!q.empty()) {x = q.front();q.pop();for(int i = 0; i < 4; i ++) {if((x.dre + 2) % 4 != i) {int x1 = x.x + dir[i][0];int y1 = x.y + dir[i][1];M y;int a = x.time;if(i == x.dre ) {if(x1 >= 0 && x1 < r && y1 >= 0 && y1 < c) {if(map[x1][y1] != '#' && !visit[i][(x.cor + 1) % 5][x1][y1]) {visit[i][(x.cor + 1) % 5][x1][y1] = 1;y.time = a + 1;y.x = x1;y.y = y1;y.cor = (x.cor + 1) % 5;y.dre = i;if(map[x1][y1] == 'T' && y.cor == 0) {time = y.time;return true;}q.push(y);}	}}else  if(!visit[i][x.cor][x.x][x.y]){visit[i][x.cor][x.x][x.y] = 1;y.x = x.x;y.y = x.y;y.dre = i;y.cor = x.cor;y.time = a + 1;q.push(y);}}}}return false;
}int main() {while(scanf("%d%d", &r, &c), r || c) {t++;if(t != 1)printf("\n");memset(map, 0, sizeof(map));memset(visit, 0, sizeof(visit));int i, j;for(i = 0; i < r; i++)scanf("%s", map[i]);M  S;for(i = 0; i < r; i++) for(j = 0; j < c; j++) {if(map[i][j] == 'S') {S.x = i;S.y = j;S.dre = 0;S.cor  = 0;S.time = 0;}}printf("Case #%d\n", t);time = 0;if(bfs(S)) printf("minimum time = %d sec\n", time);elseprintf("destination not reachable\n");while(!q.empty()) {q.pop();}}return 0;
}


这篇关于10047 - The Monocycle(BFS +状态判断)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101492

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp