您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: