UVA 816 (寫的全是bug,手動呲牙)

bfs失敗。mark

我他媽服了自己/cy
註釋

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;

const int N = 15;
int r1, c1, dir;
int end_r, end_c;
char title[1000];
const char* dirs = "NESW";
const char* turns = "FLR";
const int dr[] = { -1,0,1,0 };
const int dc[] = { 0,1,0,-1 };

int dir_id(char c) { return strchr(dirs, c) - dirs; }
int turn_id(char c) { return strchr(turns, c) - turns; }

struct Node {
	int r, c, dir;
	Node() {};
	//Node (Node&t) :r(t.r), c(t.c), dir(t.dir) {};
};

int d[N][N][4];
Node P[N][N][4];
bool has_edge[N][N][4][3];

int input();
Node walk(Node &u, int turn);
void slove();
void print_path(Node u);

int main() {
	while (input()) {
		slove();
		//cout << "input sucessfully\n";
	}
}

int input() {
	scanf("%s", title);
	if (strcmp(title, "END") == 0)
		return 0;
	printf("%s\n", title);
	int r, c;char Dir;char s[1000];
	cin >> r >> c;scanf(" %c", &Dir);cin >> end_r >> end_c;
	dir = dir_id(Dir);
	r1 = r + dr[dir_id(Dir)];
	c1 = c + dc[dir_id(Dir)];

	while (cin >> r && r) {
		cin >> c;
		while (scanf("%s", s)) {
			if (strcmp(s, "*") != 0) {
				for (int i = 1;s[i] != '\0';i++)
					has_edge[r][c][dir_id(s[0])][turn_id(s[i])] = true;
			}
			else
				break;
		}
	}
	return 1;
}

Node walk(Node &u, int turn) {      //u的dir給你改了    /cy
	Node p;
	if (turn == 1) u.dir = (u.dir + 3) % 4;
	if (turn == 2) u.dir = (u.dir + 1) % 4;
	p.c = u.c + dc[u.dir];
	p.r = u.r + dr[u.dir];
	p.dir = u.dir;
	return p;
}

void slove() {
	memset(d, -1, sizeof(d));
	queue<Node>p;
	Node u;u.c = c1;u.r = r1;u.dir = dir;
	p.push(u);
	d[r1][c1][dir] = 0;

	while (!p.empty()) {
		Node t = p.front();
		p.pop();
		if (t.r = end_r && t.c == end_c) { //你這個賦值是什麼騷操作/cy ,以後全部倒過來寫算了
			print_path(t);
			return;
		}

		for (int i = 0;i < 3;i++) {
			Node r;
			r = walk(t, i);
			if (has_edge[t.r][t.c][t.dir][i] && d[r.r][r.c][r.dir] == 0) {
				p.push(r);
				P[r.r][r.c][r.dir] = t;
				//這裏忘記了更新d[][][]
			}
		}

	}
	cout << "No Solutions" << endl;
}

void print_path(Node u) {
	vector<Node>q;
	q.push_back(u);
	for (;;) {
		if (d[u.r][u.c][u.dir] == 0)
			break;
		u = P[u.r][u.c][u.dir];
		q.push_back(u);
	}
	//沒把起點也給搞進去
	for (int i = q.size() - 1;i >= 0;i--) {
		printf("(%d,%d) ", q[i].r, q[i].c);
	}//輸出格式到時候改一改就好了
}

改了之後

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;

const int N = 15;
int r1, c1, dir;
int r0, c0;
int end_r, end_c;
char title[1000];
const char* dirs = "NESW";
const char* turns = "FLR";
const int dr[] = { -1,0,1,0 };
const int dc[] = { 0,1,0,-1 };

int dir_id(char c) { return strchr(dirs, c) - dirs; }
int turn_id(char c) { return strchr(turns, c) - turns; }

struct Node {
	int r, c, dir;
	Node() {};
	Node(int r, int c, int dir) :r(r), c(c), dir(dir) {};
	//Node (Node&t) :r(t.r), c(t.c), dir(t.dir) {};
};

int d[N][N][4];
Node P[N][N][4];
bool has_edge[N][N][4][3];

int input();
Node walk(Node u, int turn);
void slove();
void print_path(Node u);

int main() {
	while (input()) {
		slove();
		//cout << "input sucessfully\n";
	}
}

int input() {
	scanf("%s", title);
	if (strcmp(title, "END") == 0)
		return 0;
	int r, c;char Dir;char s[1000];
	cin >> r >> c;scanf(" %c", &Dir);cin >> end_r >> end_c;
	dir = dir_id(Dir);
	r1 = r + dr[dir_id(Dir)];
	c1 = c + dc[dir_id(Dir)];
	r0 = r;
	c0 = c;
	while (cin >> r && r) {
		cin >> c;
		while (scanf("%s", s)) {
			if (strcmp(s, "*") != 0) {
				for (int i = 1;s[i] != '\0';i++)
					has_edge[r][c][dir_id(s[0])][turn_id(s[i])] = true;
			}
			else
				break;
		}
	}
	return 1;
}

Node walk(Node u, int turn) {
	Node p;

	if (turn == 1) u.dir = (u.dir + 3) % 4;
	if (turn == 2) u.dir = (u.dir + 1) % 4;
	p.c = u.c + dc[u.dir];
	p.r = u.r + dr[u.dir];
	p.dir = u.dir;
	return p;
}

void slove() {
	printf("%s\n", title);
	memset(d, -1, sizeof(d));
	queue<Node>p;
	Node u;u.c = c1;u.r = r1;u.dir = dir;
	p.push(u);
	d[r1][c1][dir] = 0;

	while (!p.empty()) {
		Node t = p.front();
		p.pop();
		if (t.r == end_r && t.c == end_c) {
			print_path(t);
			return;
		}

		for (int i = 0;i < 3;i++) {
			Node r;
			r = walk(t, i);
			if (has_edge[t.r][t.c][t.dir][i] && d[r.r][r.c][r.dir] < 0) {
				p.push(r);
				P[r.r][r.c][r.dir] = t;
				d[r.r][r.c][r.dir] = d[t.r][t.c][t.dir] + 1;
			}
		}

	}
	cout << "  No Solution Possible" << endl;
}

void print_path(Node u) {
	vector<Node>q;
	q.push_back(u);
	for (;;) {
		if (d[u.r][u.c][u.dir] == 0)
			break;
		u = P[u.r][u.c][u.dir];
		q.push_back(u);
	}
	q.push_back(Node(r0, c0, dir));
	int cnt = 0;
	for (int i = q.size() - 1;i >= 0;i--) {
		if (cnt % 10 == 0)
			putchar(' ');
		printf(" (%d,%d)", q[i].r, q[i].c);
		if (++cnt % 10 == 0)
			putchar('\n');
	}
	if (q.size() % 10 != 0) printf("\n");

}

/cy 樣例過了但是WA了 /cy

先放棄了,我真實弟弟。

結構體的構造函數和複製函數還沒有搞太明白。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章