使用EasyX表示DFS深度优先搜索

酶和ATP 2022年05月14日 778次浏览

这是暑假的大作业(为了提前放假,把暑假后所谓“小学期”的课放在期末考试前的周末上!!!还是从早上八点上到下午五点!!!很生气,所以做的也比较粗糙。

使用方法:
1.安装 VisualStdioCommunity
2.安装 EasyX,下载后,将其安装到 VS2022 中。
3.在 VS2022 中新建一个项目,把下面代码复制进去,就可以跑啦!

#include <conio.h>
#include <graphics.h>
#include <windows.h>

// save maze
// 0 --> barrier
// 1 --> access
bool maze[8][8] = { 1, 1, 1, 0, 1, 1, 0, 1,
                    1, 1, 1, 0, 0, 1, 1, 1,
                    1, 0, 1, 1, 1, 0, 0, 1, 
                    1, 1, 1, 1, 1, 1, 1, 1,
                    1, 0, 1, 1, 1, 1, 0, 1,
                    1, 1, 1, 0, 1, 1, 1, 1,
                    1, 0, 1, 1, 1, 0, 1, 1,
                    1, 1, 0, 1, 0, 1, 1, 1 };

void drawTable() {
    // setup tangle border
    // leftop(50.50) rightbottom(450,450)
    rectangle(50, 50, 450, 450);
    // draw table
    for (int i = 1; i < 9; i++) line(50, 50 * (i + 1), 450, 50 * (i + 1));
    for (int i = 1; i < 9; i++) line(50 * (i + 1), 50, 50 * (i + 1), 450);
}

void drawStartAndEnd() {
    // add description
    RECT s = { 0, 0, 150, 80 };
    drawtext(_T("Start"), &s, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    // set start == left top
    solidrectangle(50, 50, 100, 100);
    // add description
    RECT e = { 0, 0, 850, 920 };
    drawtext(_T("End"), &e, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    // set end
    solidrectangle(400, 400, 450, 450);
}

void drawBarrier() {
    setfillcolor(RED);
    for (int i = 0; i < 8; i++)
        for (int j = 0; j < 8; j++) {
            if (!maze[i][j]) {
                solidrectangle(50 * (j + 1), 50 * (i + 1), 50 * (j + 2),
                    50 * (i + 2));
                Sleep(30);
            }
        }
}

bool visited[8][8];
int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };
void dfs(int sx, int sy) {
    if (sx == 7 && sy == 7) {
        // SUCCESS
        RECT s = { 100, 100, 250, 250 };
        drawtext(_T("YOU WIN!"), &s, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        Sleep(1000);
        exit(0);
    }

    // visited and draw

    
    for (int i = 0; i < 4; i++) {
        int x = sx + dx[i], y = sy + dy[i];
        // if out of maze or visited or barrier --> continue
        if (x < 0 || x > 7 || y < 0 || y > 7) continue;
        if (visited[x][y] || !maze[x][y]) continue;
        // else next
        visited[sx][sy] = true;
        solidrectangle(50 * (sy + 1), 50 * (sx + 1), 50 * (sy + 2),
            50 * (sx + 2));
        Sleep(500);
        dfs(x, y);
        
        visited[sx][sy] = false;
        clearrectangle(50 * (sy + 1), 50 * (sx + 1), 50 * (sy + 2),
            50 * (sx + 2));
    }
}

int main() {
    // init graph 500 x 500
    initgraph(500, 500);

    drawTable();
    drawStartAndEnd();
    drawBarrier();

    memset(visited, false, sizeof visited);
    setfillcolor(GREEN);
    dfs(0, 0);

    _getch();
    closegraph();
    return 0;
}

其实跑起来是有bug的,visited由bool改为int,再在下方对visited=true改为++,再对每一个visited换一个颜色说不定就好了,不过我太懒了!