求调
查看原帖
求调
961351
nightwatch.ryan楼主2024/11/30 11:59
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10;

map<char, int> dir = {{'N', 0}, {'E', 1}, {'S', 2}, {'W', 3}};
map<char, int> turn = {{'F', 0}, {'L', 1}, {'R', 2}};
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
struct Node{ int r, c, dir; };
int dis[maxn][maxn][4];
Node p[maxn][maxn][4];
bool canw[maxn][maxn][4][4];

Node walk(Node u, int turn){
	int dir = u.dir;
	if(turn == 1) dir = (dir + 3) % 4; // 左转
	if(turn == 2) dir = (dir + 1) % 4; // 右转
	return {u.r + dx[dir], u.c + dy[dir], dir};
}

int fx, fy; // fx,fy.迷宫终点
Node st, stt; // st.迷宫起点(st.r/st.c/st.dir)
string mazen; //mazen.迷宫名字(MAZEName)
bool read(){
	cin >> mazen;
	if(mazen == "END")
	 return 0;
	memset(canw, 0, sizeof(canw));
	char t;
	cin >> st.r >> st.c >> t;
	st.dir = dir[t];
	stt = st;
	cin >> fx >> fy;
	int edgeR, edgeC;
	while(cin >> edgeR){
		if(edgeR == 0)
	     break;
	 	cin >> edgeC;
	 	string x;
	 	while(cin >> x){
	 		if(x == "*")
	 		 break;
	 		int d = dir[x[0]];
	 		for(int i = 1; i < x.size(); i ++)
	 		 canw[edgeR][edgeC][d][turn[x[i]]] = 1;
	 	}
	}
	walk(stt, 0);
	return 1;
}

bool inside(int x, int y){ // 判断是否越界
	return x >= 1 && y >= 1 && x <= 9 && y <= 9;
}

void print(Node u){
	vector<Node> node;
	while(true){
		node.push_back(u);
		if(dis[u.r][u.c][u.dir] == 0) // 回溯到起点
		 break;
		u = p[u.r][u.c][u.dir];
	}
	node.push_back({st.r, st.c, st.dir});
	int cnt = 0;
	for(int i = node.size() - 1; i >= 0; i --){
		if(cnt % 10 == 0) cout << " ";
		cout << " (" << node[i].r << "," << node[i].c << ")";
		if(++cnt % 10 == 0) puts("");
 	}
 	if(node.size() % 10 != 0) puts("");
}
void solve(){
	queue<Node> q;
	memset(dis, -1, sizeof(dis));
	Node u = {stt.r, stt.c, stt.dir};
	dis[u.r][u.c][u.dir] = 0;
	q.push(u);
	while(q.size()){
		Node u = q.front();
		q.pop();
		if(u.r == fx && u.c == fy){ // arrived.
			print(u);
			return;
		}
		for(int i = 0; i < 3; i ++){
			Node v = walk(u, i);
			if(canw[u.r][u.c][u.dir][i] && inside(v.r, v.c) && dis[v.r][v.c][v.dir] == -1){
				dis[v.r][v.c][v.dir] = dis[u.r][u.c][u.dir] + 1;
				p[v.r][v.c][v.dir] = u;
				q.push(v);
			}
		}
	}
	puts("No Solution Possible");
}

int main(){ while(read()) solve(); }
2024/11/30 11:59
加载中...