POJ

来源:互联网 发布:海阔天空 信乐团知乎 编辑:程序博客网 时间:2024/05/20 23:39

题目大意:5×5 的迷宫,左上走到右下,输出最短路线。
解题思路:水题,BFS 和 DFS 都写了,感受了一下区别。
BFS 第一次到达终点就一定是最短路,输出路径的话要保留之前所有的尝试操作并记录上一步,然后从终点找回起点,利用递归输出路径。
DFS 会找出所有的路径,需要对比步数找出最短的那条,同时只需要储存当前最短的那条路径就可以,如果找到更优的路径再更新。

#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string>#include<string.h>#include<queue>#include<map>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;using namespace std;int maze[10][10];bool vis[10][10];int dx[] = {-1, 0, 1, 0};int dy[] = {0, 1, 0, -1};struct point {    int x, y;    int pre;}q[100];int bg;void bfs() {    point now, p;    p.x = p.y = 0;    p.pre = -1;    int t1, t2;    t1 = t2 = 0;    q[t2++] = p;    vis[p.x][p.y] = 1;    while (t1 < t2) {        now = q[t1++];        if (now.x == 4 && now.y == 4) {            bg = t1-1;            break;        }        for (int i = 0; i < 4; i++) {            p.x = now.x + dx[i];            p.y = now.y + dy[i];            p.pre = t1-1;            if (p.x < 0 || p.x > 4 || p.y < 0 || p.y > 4) continue;            if (!maze[p.x][p.y] && !vis[p.x][p.y]) {                q[t2++] = p;                vis[p.x][p.y] = 1;            }        }    }}void print_ans(int i) {    if (q[i].pre == -1) {        printf("(%d, %d)\n", q[i].x, q[i].y);        return;    }    print_ans(q[i].pre);    printf("(%d, %d)\n", q[i].x, q[i].y);}int main() {    for (int i = 0; i < 5; i++)        for (int j = 0; j < 5; j++)            scanf("%d", &maze[i][j]);    memset(vis, 0, sizeof(vis));    bfs();    print_ans(bg);    return 0;}

#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string>#include<string.h>#include<queue>#include<map>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;using namespace std;int maze[10][10];bool vis[10][10];int dx[] = {-1, 0, 1, 0};int dy[] = {0, 1, 0, -1};struct point {    int x, y;}tmp[100], ans[100];int MINN;void dfs(int x, int y, int cnt) {    tmp[cnt].x = x;    tmp[cnt].y = y;    if (x == 4 && y == 4) {        if (cnt < MINN) {            MINN = cnt;            for (int i = 0; i < MINN; i++)                ans[i] = tmp[i];        }        return;    }    for (int i = 0; i < 4; i++) {        int X = x+dx[i];        int Y = y+dy[i];        if (X < 0 || X > 4 || Y < 0 || Y > 4) continue;        if (!maze[X][Y] && !vis[X][Y]) {            vis[X][Y] = 1;            dfs(X, Y, cnt+1);            vis[X][Y] = 0;        }    }}int main() {    for (int i = 0; i < 5; i++)        for (int j = 0; j < 5; j++)            scanf("%d", &maze[i][j]);    memset(vis, 0, sizeof(vis));    MINN = INF;    dfs(0, 0, 0);    for (int i = 0; i < MINN; i++)        printf("(%d, %d)\n", ans[i].x, ans[i].y);    printf("(4, 4)\n");    return 0;}
原创粉丝点击