程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU - 1026 Ignatius and the Princess I

HDU - 1026 Ignatius and the Princess I

編輯:C++入門知識

題意:求在最短的時間內從左上角到右下角,每到達一個格子都要停留格子上的時間,每移動一次也都要一個單位時間,並打印每一秒所在的格子和路徑

思路:在BFS的基礎上還要加上優先隊列來求最短的時間

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int MAXN = 105;

struct node{
	int x,y;
	int step;
	friend bool operator <(node a,node b){
		return a.step > b.step;
	}
};
int d[4][2] = {{0,-1},{1,0},{0,1},{-1,0}};
char map[MAXN][MAXN];
int dir[MAXN][MAXN],v[MAXN][MAXN];
int n,m,tim,flag;

void print(int x,int y){
	if (x == 0 && y == 0)
		return;
	int nx = x - d[dir[x][y]][0];
	int ny = y - d[dir[x][y]][1];
	print(nx,ny);
	printf("%ds:(%d,%d)->(%d,%d)\n",tim++,nx,ny,x,y);
	while (v[x][y] > 0){
		printf("%ds:FIGHT AT (%d,%d)\n",tim++,x,y);
		v[x][y]--;
	}
}

void bfs(){
	memset(dir,-1,sizeof(dir));
	memset(v,-1,sizeof(v));
	priority_queue q;
	node s,tmp;
	int endx = n-1;
	int endy = m-1;
	s.x = 0,s.y = 0,s.step = 0;
	map[s.x][s.y] = 'X';
	q.push(s);
	while (!q.empty()){
		tmp = q.top();
		q.pop();
		if (tmp.x == endx && tmp.y == endy){
			flag = 1;
			printf("It takes %d seconds to reach the target position, let me show you the way.\n",tmp.step);
			tim = 1;
			print(endx,endy);
			return;
		}
		for (int i = 0; i < 4; i++){
			s = tmp;
			s.x += d[i][0];
			s.y += d[i][1];
			if (s.x < 0 || s.x >= n || s.y < 0 || s.y >= m || map[s.x][s.y] == 'X')
				continue;
			if (map[s.x][s.y] != '.'){
				s.step += map[s.x][s.y] - '0';
				v[s.x][s.y] = map[s.x][s.y] - '0';
			}
			s.step++;
			dir[s.x][s.y] = i;
			map[s.x][s.y] = 'X';
			q.push(s);
		}
	}
}

int main(){
	while (scanf("%d%d",&n,&m) != EOF){
		for (int i = 0; i < n; i++)
			scanf("%s",map[i]);
		flag = 0;
		bfs();
		if (!flag)
			printf("God please help our poor hero.\n");
		printf("FINISH\n");
	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved