HDOJ 2102 A计划 (BFS)
来源:互联网 发布:中韩贸易逆差数据 编辑:程序博客网 时间:2024/05/22 03:02
A计划
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem Description
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
Input
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
Output
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
Sample Input
15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..
Sample Output
YES
坑点:“能够在T时刻”应该是“能够在T时刻内”,所以没必要奇偶减枝,步数减枝就可以了,如果‘#’另一侧是‘#’或‘*’都不能走,bfs代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<set>#include<queue>#include<stack>#include<vector>#include<algorithm>using namespace std; //HDOJ 2102int N,M,T,si,sj,sf,pi,pj,pf,mst;int vis[3][11][11];char maz[3][11][11];int tpf[3][11][11];int va[10] = {0,0,1,-1};int vb[10] = {1,-1,0,0};bool success;int change(int f){ if(f==1) return 2; return 1;}struct point{ int pf; int px; int py; int step;};bool check(point ppt){ if(ppt.px<1||ppt.px>N||ppt.py<1||ppt.py>M) return false; if(maz[ppt.pf][ppt.px][ppt.py]=='*' || vis[ppt.pf][ppt.px][ppt.py]) return false; return true;}void bfs(){ int i; point tp,tem; queue<point> q; tp.px = si; tp.py = sj; tp.pf = sf; tp.step = 0; q.push(tp); vis[tp.pf][tp.px][tp.py] = 1; while(!q.empty()){ tp = q.front(); q.pop(); if((abs(tp.px-pi)+abs(tp.py-pj)+tp.step)>mst) continue; //预期步数减枝 if(tp.pf==pf&&tp.px==pi&&tp.py==pj&&tp.step<=mst){ success = true; return; } for(i=0;i<4;i++){ tem = tp; tem.px = tp.px + va[i]; tem.py = tp.py + vb[i]; tem.step = tp.step + 1; if(check(tem)){ if(maz[tem.pf][tem.px][tem.py]=='#'){ tem.pf = change(tem.pf); //换层 if(!vis[tem.pf][tem.px][tem.py]){ q.push(tem); vis[tem.pf][tem.px][tem.py] = 1; } }else{ q.push(tem); vis[tem.pf][tem.px][tem.py] = 1; } } } }}int main(){ int f,i,j,n,C; while(scanf("%d",&C)==1){ while(C--){ scanf("%d%d%d",&N,&M,&mst); for(f=1;f<=2;f++){ for(i=1;i<=N;i++){ for(j=1;j<=M;j++){ cin>>maz[f][i][j]; if(maz[f][i][j]=='S'){ sf = f; si = i; sj = j; } if(maz[f][i][j]=='P'){ pf = f; pi = i; pj = j; } } } } memset(vis,0,sizeof(vis)); for(i=1;i<=N;i++){ //对图进行预处理 for(j=1;j<=M;j++){ if(maz[1][i][j]=='#'&&maz[2][i][j]=='#'){ maz[1][i][j] = '*'; maz[2][i][j] = '*'; }else if(maz[1][i][j]=='#'&&maz[2][i][j]=='*'){ maz[1][i][j] = '*'; }else if(maz[2][i][j]=='#'&&maz[1][i][j]=='*'){ maz[2][i][j] = '*'; } } } success = false; bfs(); if(success) printf("YES\n"); else printf("NO\n"); } }}/*Sample Input15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..Sample OutputYES*/
阅读全文
1 0
- HDOJ 题目2102 A计划(BFS)
- HDOJ 2102 A计划(bfs)
- HDOJ 2102 A计划 (BFS)
- HDOJ-2102A计划(简单BFS)
- HDOJ 2102 A计划 (BFS)
- HDOJ 2102 A计划 (BFS)
- hdoj 2102 A计划 【BFS】
- HDOJ A计划 2102【BFS】
- hdoj 2102 A计划 【BFS】
- (BFS)A计划--HDOJ
- hdoj A计划 2102 (bfs) 好题
- hdoj 2102 A计划(简单bfs)
- HDU/HDOJ 2102 A计划 广度优先搜索BFS
- 2102 A计划【bfs】
- A计划(bfs)
- A计划(bfs)
- A计划(bfs)
- A计划(BFS)
- C++获得数组长度
- java操作redis
- Uncaught SyntaxError: Invalid or unexpected token
- DBA_Oracle Startup / Shutdown启动和关闭过程详解(概念)(对数据库进行各种维护操作)
- android输入框EditText详解
- HDOJ 2102 A计划 (BFS)
- 指针的左值及其表达式的意义
- android中SurfaceView,SurfaceViewHolder,Surface介绍
- vs使用技巧(转自马语者)
- php+jquery+ajax实现用户名验证
- postgresql里cmin与cmax有何不同.md
- RSI指标的原理和计算方法
- 线性表的基本操作 C++
- Oracle 只对部分行建索引