大佬帮忙看看吧,改了好久了。┭┮﹏┭┮
查看原帖
大佬帮忙看看吧,改了好久了。┭┮﹏┭┮
376452
colin_lord楼主2021/9/27 21:19
#include<iostream>
#include<bits/stdc++.h>

using namespace std;
const char* dirs = "NESW";
const char* turns = "FLR";
const int dx[4] = {-1 , 0 , 1 , 0} , dy[4] = {0 , 1 , 0 , -1} , N = 11;
int sx , sy , x2 , y2 , ndir , r0 , c0;
int d[N][N][5];
bool edge[N][N][5][5];
string s;
char b;
struct node{
	int x , y , dir;
	node(){x = 0 , y = 0 , dir = 0;}
	node(int x1 , int y1 , int dir1){
	x = x1 , y = y1 , dir = dir1;
	}
}fa[N][N][5];
int gett(char c){return strchr(turns , c) - turns;}
int getd(char c){return strchr(dirs , c) - dirs;}

node walk(const node &u , int turn)
{
	int dir = u.dir;
	if(turn == 1) dir = (dir + 3) % 4;
	else if(turn == 2) dir = (dir + 1) % 4;
	return node(u.x + dx[dir] , u.y + dy[dir] , dir);
}

bool exist(int x , int y){return 1 <= x && x <= N && y >= 1 && y <= N;}

void print_ans(node u)
{
	vector<node> nodes;
	for(;;){
		nodes.push_back(u);
		if(d[u.x][u.y][u.dir] == 0) break;
		u = fa[u.x][u.y][u.dir];
	}
	nodes.push_back(node(r0 , c0 , ndir));
	
	int cnt = 0;
	for(int i = nodes.size() - 1;i >= 0;i --){
		if(cnt %10 == 0 && cnt) printf(" ");
		printf(" (%d,%d)" , nodes[i].x , nodes[i].y);
		if(++ cnt % 10 == 0) printf("\n");
	}
}

void bfs()
{
	queue<node> q;
	q.push(node(sx , sy , ndir));
	d[sx][sy][ndir] = 0;
	while(q.size()){
		node u = q.front(); q.pop();
		if(u.x == x2 && u.y == y2){
		print_ans(u);
		cout << endl;
		return ;
	    }
		for(int i = 0;i < 3;i ++){
			if(edge[u.x][u.y][u.dir][i]){
				node v = walk(u , i);
				if(d[v.x][v.y][v.dir] < 0){
				d[v.x][v.y][v.dir] = d[u.x][u.y][u.dir] + 1;
				fa[v.x][v.y][v.dir] = u;
				q.push(v);
			    }	
			}
		}
    }
    cout << " No Solution Possible" << endl;
    return ;
}



int main()
{
	while(cin >> s){
		if(s == "END"){
		    return 0;
		}cout << s << endl;
		memset(d , -1 , sizeof d);
		memset(edge , 0 , sizeof edge);
		cin >> sx >> sy >> b >> x2 >> y2;
		r0 = sx , c0 = sy;
		ndir = getd(b);
		sx = sx + dx[ndir];
		sy = sy + dy[ndir];
		int r1 , c1;
		while(scanf("%d" , &r1) && r1){
		    scanf("%d" , &c1);
		   	char b[20];
		   	while(cin >> b && b[0] != '*'){
		   	    for(int i = 1;i < strlen(b);i ++)
		        edge[r1][c1][getd(b[0])][gett(b[i])] = 1;
		    }
		}
		bfs();
	}
	return 0;
}
/*
SAMPLE
3 1 N 3 3
1 1 WL NR *
1 2 WLF NR ER *
1 3 NL ER *
2 1 SL WR NF *
2 2 SL WF ELF *
2 3 SFR EL *
0
NOSOLUTION
3 1 N 3 2
1 1 WL NR *
1 2 NL ER *
2 1 SL WR NFR *
2 2 SR EL *
0
MyMaze1
3 1 N 1 1
0
MyMaze2
3 1 N 3 1
0
MyMaze3
3 1 N 2 1
0
MyMaze4
2 2 W 3 2
1 1 NR *
1 2 ER *
2 1 WR *
2 2 SF *
0
MyMaze5
2 2 N 2 3
1 1 WL *
1 2 NL *
2 1 SF *
2 2 NR *
3 1 SL *
3 2 EL *
0
Circle
2 1 N 2 1
1 1 NR *
1 2 ER *
2 2 SF *
3 1 WR *
3 2 SR *
0
RobertAbbottAtlanta
4 2 N 4 3
1 1 NR WL *
1 2 NLR WF EFR *
1 3 EFR WFR NL *
1 4 ER NL *
2 1 SFL WL NFR *
2 2 EL SFLR WFRL NFL *
2 3 EFLR SF NF WFRL *
2 4 SR ELR NF *
3 1 WR SL *
3 2 EFL SLR WR NF *
3 3 EFL SLR WL *
3 4 EL SR *
0
END
*/
2021/9/27 21:19
加载中...