hdu 2102

原创 2018年04月16日 19:15:57

题不可貌相,切忌眼高手低。

这道题的关键是对传送机预处理:当传过去为‘*’时,这个传送机设置为‘*’即可,当传过去为‘#’时,两个传送机都设置为‘*’即可。

记录一下坑点:

    1、忽视了可以从2层下到1层

    2、当扫描到传送机时,将传送机以及另一层相应位置上的点一齐赋值并将该点入队而忘记判断那个点是不是已经访问过。

再吐槽一下这道题本身:表意不清!

    如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

现在想来,这应该是错别字了:能够在T时刻内写成了能够在T时刻能。就是因为这儿,虽然感到奇怪,但仍然让我以为必须恰好在T时刻到达公主的位置,为了解决这个问题还借鉴了奇偶剪枝的思想。

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

const int inf = 0x3f3f3f3f;
struct Point{
	int f, x, y;
};
int dir[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
char g[2][15][15];
int cnt[2][15][15];
int n, m;

bool judge(int x, int y){
	return 0 <= x && x < n && 0 <= y && y < m;
}

void bfs(Point p){
	queue <Point> q;
	q. push(p);
	cnt[p. f][p. x][p. y] = 0;
	while(! q. empty()){
		Point t = q. front();
		q. pop();
		int nx, ny;
		for(int i = 0; i < 4; i ++){
			nx = t. x + dir[i][0], ny = t. y + dir[i][1];
			if(judge(nx, ny) && g[t. f][nx][ny] != '*' && cnt[t. f][nx][ny] == inf){
				if(g[t. f][nx][ny] == '#'){
					cnt[t. f][nx][ny] = cnt[t. f][t. x][t. y] + 1;
					if(cnt[! t. f][nx][ny] == inf){
						cnt[! t. f][nx][ny] = cnt[t. f][t. x][t. y] + 1; 
						if(g[! t. f][nx][ny] != '#')
							q. push({! t. f, nx, ny});
					}
				}
				else{				
					cnt[t. f][nx][ny] = cnt[t. f][t. x][t. y] + 1;
					q. push({t. f, nx, ny});
				}
			}
		}
	}
}

int main(){
	int c;
	cin >> c;
	while(c --){
		int T;
		int ef, ex, ey;
		cin >> n >> m >> T;
		memset(cnt, 0x3f, sizeof(cnt));
		for(int w = 0; w < 2; w ++)
		for(int i = 0; i < n; i ++)
		for(int j = 0; j < m; j ++){
			cin >> g[w][i][j];
			if(g[w][i][j] == 'P'){
				ef = w, ex = i, ey = j;
			} 
		}
		for(int w = 0; w < 2; w ++)
		for(int i = 0; i < n; i ++)
		for(int j = 0; j < m; j ++){
			if(g[w][i][j] == '#' && g[! w][i][j] == '*')
				g[w][i][j] = '*';
			if(g[w][i][j] == '#' && g[! w][i][j] == '#')
				g[w][i][j] = g[! w][i][j] = '*';
		}

		bfs({0, 0, 0});
		if(cnt[ef][ex][ey] <= T)
			cout << "YES" << endl;			
		else
			cout << "NO" << endl;
	}
	return 0;
}

HDU 2102 A计划(深搜)

Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的...
  • Lcc_2016
  • Lcc_2016
  • 2016-07-15 16:43:39
  • 678

HDU2102---A计划(附测试数据)

A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis...
  • hy1405430407
  • hy1405430407
  • 2015-06-14 13:43:01
  • 1222

A计划 HDU杭电2102【广搜+STL队列】

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长...
  • yuzhiwei1995
  • yuzhiwei1995
  • 2015-08-09 17:57:06
  • 595

ACM 搜索 hdu 2102 A计划

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能...
  • Little_boy_z
  • Little_boy_z
  • 2016-05-28 11:05:44
  • 344

HDU - 2102 A计划

HDU - 2102 A计划
  • lzc504603913
  • lzc504603913
  • 2017-06-04 13:50:08
  • 95

hdu2102 双层bfs

hdu2102 当传送的目的地是墙或者仍是传送机的时候就不要去了,把他当做墙. #include #include using namespace std; struct poi...
  • dellaserss
  • dellaserss
  • 2012-10-31 20:18:06
  • 1860

错误2102

今天项目上遇到了个问题,上传5M的东西居然报错了,原来可以30M呢,程序没有变动过,这是怎么回事呢?2102错误的官方解释是: ...
  • lizhyfrank
  • lizhyfrank
  • 2007-07-26 15:14:00
  • 2172

【日常学习】【区间DP】codevs1048 石子归并题解

题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够...
  • ametake
  • ametake
  • 2015-08-10 10:37:57
  • 521

iOS Https

iOS Https
  • u012460084
  • u012460084
  • 2015-09-11 10:39:56
  • 1671

HDU 2102

第一道比较正规的BFS。
  • sky_miange
  • sky_miange
  • 2015-01-28 21:28:59
  • 455
收藏助手
不良信息举报
您举报文章:hdu 2102
举报原因:
原因补充:

(最多只允许输入30个字)