EOJ 2253 深度优先搜索

来源:互联网 发布:局域网远程软件 编辑:程序博客网 时间:2024/06/08 03:51

简单的深度优先搜索,题目有3点需要注意

1.dfs的时候标记的处理

2.搜索的时候要按照字典序

3.输出不要忘了空行

代码如下:

#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <queue>#include <map>using namespace std;int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};//按照字典序搜索int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};const int maxn = 100;int n, m, vis[maxn][maxn];struct Node{int x, y;};Node path[maxn][maxn];bool judge(){//判断棋盘的每一个位置是不是都走过了    for (int i = 1; i <= n; i++)    for (int j = 1; j <= m; j++)        if (!vis[i][j]) return false;    return true;}bool dfs(int x, int y){    vis[x][y] = 1;    bool find_next = false;    for (int d = 0; d < 8; d++){        int xx = x + dx[d];        int yy = y + dy[d];        if (xx>0&&xx<=n&&yy>0&&yy<=m&&!vis[xx][yy]){            find_next = true;            //printf("%d %d -> %d %d\n", x, y, xx, yy);            path[x][y] = Node{xx, yy};            if (dfs(xx, yy)) return true;            vis[xx][yy] = 0;//一定要标记成0!            path[x][y] = Node{0, 0};        }    }    if (!find_next && judge()) return true;//如果没有找到下一个状态,判断是不是棋盘的所有位置是不是走过了    return false;}void print_ans(int x, int y){    printf("%c%d", y - 1 + 'A', x);    if (path[x][y].x){        print_ans(path[x][y].x, path[x][y].y);    }else printf("\n");}int main(){    //freopen("1.txt", "r", stdin);    int T, Case = 1;    scanf("%d", &T);    while (T--){        scanf("%d%d", &n, &m);        printf("Scenario #%d:\n", Case++);        memset(vis, 0, sizeof(vis));        for (int i = 0; i < maxn; i++)//路径数组初始化            for (int j = 0; j < maxn; j++)                path[i][j] = Node{0, 0};        if (!dfs(1, 1)) printf("impossible\n");        else print_ans(1, 1);        printf("\n");//输出空行    }    return 0;}


0 0
原创粉丝点击