HDU 1026 Ignatius and the Princess I BFS
2015-12-11 12:55
281 查看
题意:从(1,1)(1,1)到(n,m)(n,m)最少要走多少秒?(如果方格上有数字,意思就是要停留多少秒?)
思路:BFS,对于方格上有数字的情况,把数字减1,然后再次加入队列,对于记录路径,我是A[i][j]A[i][j]代表到达(i,j)(i,j)的前一个点,输出的时候从A[n][m]A
[m]往前面找即可。
坑点:输出路径,烦的一匹。然而一遍过还是感觉萌萌哒。
http://acm.hdu.edu.cn/showproblem.php?pid=1026/********************************************* Problem : HDU 1026 Author : NMfloat InkTime (c) NM . All Rights Reserved . ********************************************/ #include <map> #include <set> #include <queue> #include <cmath> #include <ctime> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define rep(i,a,b) for(int i = a ; i <= b ; i ++) #define rrep(i,a,b) for(int i = b ; i >= a ; i --) #define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next) #define cls(a,x) memset(a,x,sizeof(a)) #define eps 1e-8 using namespace std; const int MOD = 1e9+7; const int INF = 0x3f3f3f3f; const int MAXN = 1e5+5; const int MAXE = 2e5+5; typedef long long LL; typedef unsigned long long ULL; struct Node { int x,y,t,nt; int fromx,formy; Node() {} Node(int _x,int _y,int _t,int _nt,int _fromx,int _fromy) {x = _x;y = _y;t = _t;nt = _nt;fromx = _fromx ; formy = _fromy;} }t[10005]; struct Point { int x,y; Point() {} Point(int _x,int _y) {x = _x;y = _y;} }A[105][105]; Point root[225]; int T,n,m,k; char Map[105][105]; char BMap[105][105]; int fx[] = {0,1,-1,0,0}; int fy[] = {0,0,0,1,-1}; int second ; queue<Node>q; bool BFS() { while(!q.empty())q.pop(); q.push(Node(1,1,0,0,0,0)); while(!q.empty()) { Node tmp = q.front(); q.pop(); if(tmp.x == n && tmp.y == m ) { second = tmp.t + tmp.nt; return true; } if(tmp.nt) { q.push(Node(tmp.x,tmp.y,tmp.t+1,tmp.nt-1,tmp.x,tmp.y)) ; continue; } rep(i,1,4) { int tmpx = tmp.x + fx[i]; int tmpy = tmp.y + fy[i]; if(tmpx >= 1 && tmpx <= n && tmpy >= 1 && tmpy <= m) { if(Map[tmpx][tmpy] == '.') { q.push(Node(tmpx,tmpy,tmp.t+1,0,tmp.x,tmp.y)); A[tmpx][tmpy] = Point(tmp.x,tmp.y); } else if(Map[tmpx][tmpy] == 'X') { } else { q.push(Node(tmpx,tmpy,tmp.t+1,Map[tmpx][tmpy]-'0',tmp.x,tmp.y)); A[tmpx][tmpy] = Point(tmp.x,tmp.y); } Map[tmpx][tmpy] = 'X'; } } } return false; } void input() { rep(i,1,n) scanf("%s",Map[i]+1) ; rep(i,1,n) rep(j,1,m) { BMap[i][j] = Map[i][j]; } } void solve() { if(BFS()) { int tmpx,tmpy,x0,y0; int tot = 1; tmpx = n ; tmpy = m ; root[tot++] = Point(tmpx,tmpy); while(tmpx != 1 || tmpy != 1) { x0 = A[tmpx][tmpy].x ; y0 = A[tmpx][tmpy].y; tmpx = x0 ; tmpy = y0; root[tot++] = Point(tmpx,tmpy); } printf("It takes %d seconds to reach the target position, let me show you the way.\n",second); second = 1; rrep(i,1,tot-1) { if(i == 1) { while(BMap[root[i].x][root[i].y] > '0') { printf("%ds:FIGHT AT (%d,%d)\n",second++,root[i].x-1,root[i].y-1); BMap[root[i].x][root[i].y] -- ; } break; } if(BMap[root[i].x][root[i].y] != '.') { while(BMap[root[i].x][root[i].y] > '0') { printf("%ds:FIGHT AT (%d,%d)\n",second++,root[i].x-1,root[i].y-1); BMap[root[i].x][root[i].y] -- ; } } printf("%ds:(%d,%d)->(%d,%d)\n",second++,root[i].x-1,root[i].y-1,root[i-1].x-1,root[i-1].y-1); } } else puts("God please help our poor hero."); puts("FINISH"); } int main(void) { //freopen("a.in","r",stdin); //scanf("%d",&T); while(T--) { while(~scanf("%d %d",&n,&m)) { //while(scanf("%d",&n),n) { input(); solve(); } return 0; }
相关文章推荐
- kaptcha验证码使用
- 积累1数
- php laravel 帧 该文件上传
- Hadoop教程(二):安装
- sh: symbol lookup error: sh: undefined symbol: rl_signal_event_hook错误
- js及jquery获取页面和元素的宽高
- Hadoop教程(一):简介、大数据解决方案、介绍快速入门
- iOS判断一个字符串中是否都是数字
- Java工程师成神之路~
- 计算定积分
- Mybatis的原理、搭建与使用
- 画图板的改进和多态
- knockout之入门介绍
- php创建空对象
- learn python the hard way(笨办法学python) 练习32 附加练习
- MYSQL查看表格字段属性
- ecshop商品分类页获取相册列表方法
- 追求Masonry(看过最好的masonry中文博文)
- jsp版计算器
- 关于机器学习