zoukankan      html  css  js  c++  java
  • 【作业】用栈模拟dfs

    题意:一个迷宫,起点到终点的路径,不用递归。

    题解:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string>
    #include<string.h>
    #include<stack>
    #include<iostream>
    #include<map>
    using namespace std;
    const int maxn = 1e5 + 5;
    int dir[4][2] = { 1,0,0,1,-1,0,0,-1 };
    struct node {
        int x, y;
        node(int x=0, int y=0) :x(x), y(y) {}
        bool operator < (const node &q) const { return  x < q.x; }
        bool operator ==(const node &a)const { return x == a.x&&y == a.y; }
    };
    struct prob {
        int ord;
        node seat;
        int di;
        prob(int x , node y, int z ) :ord(x), seat(y), di(z) {}
    };
    int mp[15][15] = {
        { 0,0,0,0,0,0,0,0,0,0 },
        { 1,1,0,0,0,1,1,1,1,1 },
        { 1,1,1,0,0,1,1,1,1,1 },
        { 1,1,1,1,0,0,0,1,1,1 },
        { 1,1,1,1,1,0,1,1,1,1 },
        { 1,1,1,1,1,0,1,1,1,1 },
        { 1,1,1,1,1,0,0,0,0,1 },
        { 1,1,1,1,1,1,1,1,0,1 },
        { 1,1,1,0,1,1,1,1,0,1 },
        { 1,0,0,1,1,1,1,1,0,0 },
    };
    
    stack<prob> S, road;
    int vis[1000][1000];
    map<node, node>p;
    int n, m;
    bool ok(int x, int y) {
        if (mp[x][y] ==1 || x < 0 || x >= m || y < 0 || y >= n || vis[x][y])return 0;
        else return 1;
    }
    node nextpos(node n,int i) {
        return node(n.x + dir[i][0], n.y + dir[i][1]);
    }
    int main() {
        
        cin >> n >> m;
        
        int sr, sc; cin >> sr >> sc;
        int er, ec; cin >> er >> ec;
        node end = node(er, ec);
        node start = node(sr, sc);
        //S.push(0,node(sr, sc),0);
        node now=start;
        int nows=0;
        prob e= prob(nows, now, 0);
        do {
            if (ok(now.x, now.y)) {
                vis[now.x][now.y] = 1;
                 e = prob(nows, now, 0);
                S.push(e);
                if (now== end)break;
                now = nextpos(now, 0);
                nows++;
            }
            else {
                if (!S.empty()) {
                    e = S.top();
                    S.pop();
                    while (e.di == 3 && !S.empty()) {
                        vis[e.seat.x][e.seat.y] = 1;
                        e = S.top();
                        S.pop();
                    }
                    if (e.di < 3) {
                        e.di++; S.push(e);
                        now = nextpos(now, e.di);
                    }///
    
                }
            }
        } while (!S.empty());
    
        stack<prob>ans;
        while (!(S.empty()) ){
            ans.push(S.top());
            S.pop();
        }
        while (!(ans.empty())) {    
            cout << ans.top().seat.x << ' ' << ans.top().seat.y << endl;
            ans.pop();
        }
        cin >> n;
    }

    附:之前模仿bfs写的,不知道怎么存路径。。

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string>
    #include<string.h>
    #include<stack>
    #include<iostream>
    #include<map>
    using namespace std;
    const int maxn = 1e5 + 5;
    int dir[4][2] = { 1,0,0,1,-1,0,0,-1 };
    struct node {
        int x, y;
        node(int x=0, int y=0) :x(x), y(y) {}
        bool operator < (const node &q) const { return  x < q.x; }
    };
    int mp[15][15] = {
        { 0,0,0,0,0,0,0,0,0,0 },
        { 1,1,0,0,0,1,1,1,1,1 },
        { 1,1,1,0,0,1,1,1,1,1 },
        { 1,1,1,1,0,0,0,1,1,1 },
        { 1,1,1,1,1,0,1,1,1,1 },
        { 1,1,1,1,1,0,1,1,1,1 },
        { 1,1,1,1,1,0,0,0,0,1 },
        { 1,1,1,1,1,1,1,1,0,1 },
        { 1,1,1,0,1,1,1,1,0,1 },
        { 1,0,0,1,1,1,1,1,0,0 },
    };
    
    stack<node> S, road;
    int vis[1000][1000];
    map<node, node>p;
    int n, m;
    bool illeg(int x, int y) {
        if (mp[x][y] == '1' || x < 0 || x >= m || y < 0 || y >= n || vis[x][y])return 1;
        else return 0;
    }
    
    int main() {
        
        cin >> n >> m;
        
        int sr, sc; cin >> sr >> sc;
        int er, ec; cin >> er >> ec;
        S.push(node(sr, sc));
        while (!S.empty()) {
            node now = S.top(); S.pop();
            road.push(now);
            //if (mp[now.x][now.y] == '1' || now.x < 0 || now.x >= m || now.y < 0 || now.y >= n || vis[now.x][now.y])continue;
            //S.push(now);
            if (now.x == er&&now.y == ec) break;
            for(int i=0;i<4;i++){
                    int dx = now.x + dir[i][0]; int dy = now.y + dir[i][1];
                    if(illeg(dx,dy))continue;
                    if (vis[dx][dy])continue;
                    S.push(node(dx, dy));
                    node x = node(dx, dy);
                    p[x] = now;
                    vis[dx][dy] = 1;
                }
            /*for (int i = 0; i < m; i++){
                for (int j = 0; j < n; j++) {
                    cout << vis[i][j];
                }
            cout<<endl;
            }
            cout << endl;*/
        }
        node now=node(er,ec);
        node x = node(sr, sc);
        while (!(now.x==sr&&now.y==sc) ){
            cout << now.x << ' ' << now.y << endl;
            now = p[now];
        }
        cin >> n;
    }
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    eclipse快捷键 Eclipse快捷键 10个最有用的快捷键
    ssh之雇员管理系统(5)将struts+spring整合2
    ssh之雇员管理系统(4)改进的hibernate测试
    java中常常建包时,这些包具体是什么意思呢?+项目开发流程、实战
    ssh之雇员管理系统(1)spring测试
    JUnit4概述
    ssh之雇员管理系统(5)添加struts测试
    SQl查询数据库表名、表的列名
    关于人脉大PK的二三事 推荐的方法
    JavaScript有用的代码(ie,save)
  • 原文地址:https://www.cnblogs.com/SuuT/p/8893195.html
Copyright © 2011-2022 走看看