您的位置:首页 > 其它

sicily 1135

2010-12-18 13:45 387 查看
这题一开始我是用dfs+剪枝做的(可连续飞行却只算一步这条件引发的,做下去应该可以的~),后来改用dfs,做得很顺利,提交,WA。。郁闷了,想了好久也想不出,后来请教了阿樵,发觉原来是总飞行路程是不能超过D,不是每一次飞行不能超过D,进行修改,但是还是WA。。最后研究发现了一个point:飞行一格跟移动一格的区别,好吧。。又WA。。原来是原来的代码没改好,再交,AC了!!



/*
 * test.cpp
 *
 *  Created on: Dec 17, 2010
 *      Author: alfred
 */
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
struct node {
	int x, y;
	int step;
	int flySteps;
	node(int x, int y, int step = 0, int flySteps = 0) {
		this->x = x;
		this->y = y;
		this->step = step;
		this->flySteps = flySteps;
	}
};
bool isVis[101][101][4][101];
char data[101][101];
int m, n, D;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void bfs() {
	queue<node> q;
	memset(isVis[0][0], true, sizeof(isVis[0][0]));
	node tmp(0, 0, 0, 0);
	q.push(tmp);
	while(!q.empty()) {
		tmp = q.front();
		q.pop();
		if(tmp.x == m - 1 && tmp.y == n - 1) {
			cout << tmp.step << endl;
			return;
		}
		for(int i = 0; i < 4; i++) {
			int step = tmp.step + 1;
			int x = tmp.x;
			int y = tmp.y;
			int flySteps = tmp.flySteps;
			//just move
			x += dx[i];
			y += dy[i];
			if(x >= 0 && y >= 0 && x < m && y < n && !isVis[x][y][i][flySteps] && data[x][y] == 'P') {
				q.push(node(x, y, step, flySteps));
				isVis[x][y][i][flySteps] = true;
			}
			//use flying
			x = tmp.x;
			y = tmp.y;
			flySteps++;
			for(; flySteps <= D; flySteps++) {
				x += dx[i];
				y += dy[i];
				if(!(x >= 0 && y >= 0 && x < m && y < n)) break;
				if(data[x][y] == 'L' || isVis[x][y][i][flySteps])
					continue;
				q.push(node(x, y, step, flySteps));
				isVis[x][y][i][flySteps] = true;
			}
		}
	}
	cout << "impossible" << endl;
}
int main() {
	while(cin >> m >> n >> D) {
		memset(isVis, false, sizeof(isVis));
		memset(data, 0, sizeof(data));
		for(int i = 0; i < m; i++) {
			cin >> data[i];
		}
		data[m - 1][n - 1] = 'P';
		bfs();
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: