6044:鸣人和佐助

http://noi.openjudge.cn/ch0205/6044/
依然是BFS框架,但是这里有个新的约束条件,是查克拉,所以状态参数应该是R(x,y,k),因为相同x,y若有不同的查克拉,应该对应于不同的状态。注意这点即可。

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

struct State {
	int x, y, k, t;
	State() {};
	State(int xx, int yy, int kk, int tt) :x(xx), y(yy), k(kk), t(tt) {};
};

queue q;
bool flag[210][210][11];
char maze[210][210];
int M, N, T,endi,endj;
int to[4][2] = { 0,1,1,0,0,-1,-1,0 };

int main() {
	scanf("%d%d%d\n", &M, &N, &T);
	for (int i = 0;i < M;i++) {
		for (int j = 0;j < N;j++) {
			scanf("%c", &maze[i][j]);
			if (maze[i][j] == '@') {
				q.push(State(i, j, T, 0));
			}
			if (maze[i][j] == '+') {
				endi = i;
				endj = j;
			}
		}
		getchar();
	}

	bool success = false;
	while (!q.empty()) {
		State s = q.front();
		if (s.x == endi && s.y == endj) {
			printf("%d", s.t);
			success = true;
			break;
		}
		for (int t = 0;t < 4;t++) {
			int x = s.x + to[t][0];
			int y = s.y + to[t][1];
			if (x >= 0 && x < M && y >= 0 && y < N) {
				if (maze[x][y] == '#'&&s.k <1) {
					continue;
				}
				int k = maze[x][y] == '#' ? s.k - 1 : s.k;
				if (!flag[x][y][k]) {
					flag[x][y][k] = 1;
					q.push(State(x, y, k, s.t + 1));
				}
			}
		}
		q.pop();
	}

	if (!success) {
		printf("-1");
	}
	return 0;
}

你可能感兴趣的:(poj)