DFS小练习

来源:互联网 发布:希腊存款担保移民 知乎 编辑:程序博客网 时间:2024/05/16 15:40

这里写图片描述
这里写图片描述

#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>#include<algorithm>#include<queue>#include<set>#include<iterator>#include<map>using namespace std;typedef unsigned long long ll;int used[110][110];char maze[110][110];int n, m, k, fork, ans;int sx, sy;int ex, ey;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};bool legal(int x, int y){       if(used[x][y] == 1 || maze[x][y] == 'X') return false;    return x >= 0 && x < n && y >= 0 && y < m;}void dfs(int x, int y, int fork){    //cout << " (" << x << ", " << y << ") -> ";    if(maze[x][y] == '*'){        ans = fork;        return;    }    int dir = 0;    for(int i = 0; i < 4; i++){        int nx = x + dx[i];        int ny = y + dy[i];        if(legal(nx, ny)) dir++;    }    for(int i = 0; i < 4; i++){        int nx = x + dx[i];        int ny = y + dy[i];        if(legal(nx, ny)){            used[nx][ny] = 1;            if(dir > 1) dfs(nx, ny, fork + 1);            else dfs(nx, ny, fork);            used[nx][ny] = 0;           }    }}int main(){    int t;    scanf("%d", &t);    while(t--){        memset(used, 0, sizeof(used));        scanf("%d%d", &n, &m);        for(int i = 0; i < n; i++){            for(int j = 0; j < m; j++){                scanf(" %c", &maze[i][j]);                if(maze[i][j] == 'M'){                    sx = i; sy = j;                }                if(maze[i][j] == '*'){                    ex = i; ey = j;                }            }        }        scanf("%d", &k);        fork = 0; ans = 0;        used[sx][sy] = 1;        dfs(sx, sy, fork);        //cout << "ans: " << ans << endl;        if(ans == k) printf("Impressed\n");        else printf("Oops!\n");     }    return 0;}
原创粉丝点击