这题一开始我是用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(); } }
1505

被折叠的 条评论
为什么被折叠?



