poj-3083 Children of the Candy Corn

来源:互联网 发布:怎么释放被占用的端口 编辑:程序博客网 时间:2024/06/15 23:47
#include<iostream>#include<queue>#include<cstring>using namespace std;char map[50][50];int dl[4][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};int dr[4][2] = {{0, 1}, {-1, 0}, {0, -1}, {1, 0}};int dx[4] = {0, 1, 0, -1};int dy[4] = {1, 0, -1, 0};int sx, sy, ex, ey;int w, h;int vis[50][50];struct Pos{int x, y, s;};int dfs(int x, int y, int d, int step, int dir[][2]) {int i;for(i = 0; i < 4; i++) {int j = ((d - 1 + 4) % 4 + i) % 4;int nx = x + dir[j][0];int ny = y + dir[j][1];if(nx == ex && ny == ey) return step + 1;else if(nx < 0 || ny < 0 || nx > h || ny > w || map[nx][ny] == '#') continue;return dfs(nx, ny, j, step + 1, dir);}}int BFS(int sx, int sy) {queue<Pos> Q;Pos t = {sx, sy, 1};Q.push(t);vis[sx][sy] = 1;while(!Q.empty()) {Pos p = Q.front();Q.pop();if(p.x == ex && p.y == ey) return p.s;Pos np;int i;for(i = 0; i < 4; i++) {np.x = p.x + dx[i];np.y = p.y + dy[i];np.s = p.s + 1;if(np.x < 0 || np.y < 0 || np.x > h || np.y > w || map[np.x][np.y] == '#' || vis[np.x][np.y] == 1) continue;vis[np.x][np.y] = 1;Q.push(np);}}return -1;}int main() {int n;cin >> n;while(n--) {int d1, d2;cin >> w >> h;cin.get();int i, j;for(i = 0; i < h; i++) {for(j = 0; j < w; j++) {cin >> map[i][j];if(map[i][j] == 'S') {sx = i;sy = j;}else if(map[i][j] == 'E') {ex = i;ey = j;}}}if(sx == 0) {d1 = 3;d2 = 3;}else if(sx == h - 1) {d1 = 1;d2 = 1;}else if(sy == 0) {d1 = 2;d2 = 0;}else if(sy == w - 1) {d1 = 0;d2 = 2;}cout << dfs(sx, sy, d1, 1, dl) << ' ';cout << dfs(sx, sy, d2, 1, dr) << ' ';memset(vis, 0, sizeof(vis));cout << BFS(sx, sy) << endl;}return 0;}


第一次做,看了题解,代码是上面这样的。

很久以后自己重新做了一遍,代码是下面这样的。。。

本题的难点就在于方向的控制吧


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;int h, w;char map[50][50];int fol[4][2] = {0, -1, -1, 0, 0, 1, 1, 0};int fori[4][2] = {0, 1, -1, 0, 0, -1, 1, 0};int sx, sy, ex, ey;int l, r, s;struct p {int x, y, num;};void dfsl(int x, int y, int dir, int step) {if(l) return;if(x == ex && y == ey) {l = step + 1;return;}int i, j;for(i = 0, j = dir; i < 4; i++, j = (j + 1) % 4) {int tx = x + fol[j][0];int ty = y + fol[j][1];if(tx < 1 || tx > h || ty < 1 || ty > w) continue;if(map[tx][ty] == '#') continue;dfsl(tx, ty, (j + 3) % 4, step + 1);}}void dfsr(int x, int y, int dir, int step) {if(r) return;if(x == ex && y == ey) {r = step + 1;return;}int i, j;for(i = 0, j = dir; i < 4; i++, j = (j + 1) % 4) {int tx = x + fori[j][0];int ty = y + fori[j][1];if(tx < 1 || tx > h || ty < 1 || ty > w) continue;if(map[tx][ty] == '#') continue;dfsr(tx, ty, (j + 3) % 4, step + 1);}}void bfs() {queue<p> q;p t;map[sx][sy] = '#';t.x = sx;t.y = sy;t.num = 0;q.push(t);while(!q.empty()) {int i;p tt = q.front();q.pop();if(tt.x == ex && tt.y == ey) {s = tt.num + 1;return;}for(i = 0; i < 4; i++) {p ttt;ttt.x = tt.x + fol[i][0];ttt.y = tt.y + fol[i][1];if(ttt.x < 1 || ttt.x > h || ttt.y < 1 || ttt.y > w) continue;if(map[ttt.x][ttt.y] == '#') continue;map[ttt.x][ttt.y] = '#';ttt.num = tt.num + 1;q.push(ttt);}}}int main() {int T;scanf("%d", &T);while(T--) {scanf("%d %d", &w, &h);getchar();int i, j;for(i = 1; i <= h; i++) {for(j = 1; j <= w; j++) {scanf("%c", &map[i][j]);if(map[i][j] == 'S') sx = i, sy = j;else if(map[i][j] == 'E') ex = i, ey = j;}getchar();}int ordir;  //original directionif(sx == h) ordir = 0;else if(sy == 1) ordir = 1;else if(sx == 1) ordir = 2;else if(sy == w) ordir = 3; l = 0;dfsl(sx, sy, ordir, 0);r = 0;dfsr(sx, sy, ordir, 0);s = 0;bfs();printf("%d %d %d\n", l, r, s);}return 0;}


0 0
原创粉丝点击