• POJ 2488 DFS


    DES:给一个n行m列的棋盘。马以L型走。问能否从某一位置开始走完棋盘上的每个位置。若能继续输出字典序最小的一条路径。

    很典型的dfs。搜的时候就按照字典序从小到大的顺序。搜到第一条路径时停止搜索输出路经就好了。感觉dfs很机智。WA了几次都是因为保存答案那里没有回溯。。。。。。。。。。一开始还以为没搞清楚行和列哪个是用字母表示的.....T_T ....读题很难的.....

    A Knight's Journey

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    
    bool flag;
    int vis[30][30];
    int x[81], y[81];
    int n, m;
    int dx[] = { -1, 1, -2, 2, -2, 2, -1, 1 },
        dy[] = { -2, -2, -1, -1, 1, 1, 2, 2 }; //注意顺序
    int cnt;
    
    void dfs(int xxx, int yyy)
    {
        if (flag == false) return;
        if (cnt == n*m)
        {
            for (int i=0; i<cnt; ++i)
            {
                cout << char(y[i]+'A') << char(x[i]+'1');
            }
            cout << endl << endl;
            flag = false;
            return;
        }
    
        for (int i=0; i<8; ++i)
        {
            int xx = xxx+dx[i];
            int yy = yyy+dy[i];
            if (xx>=0 && xx<n && yy>=0 && yy<m && !vis[xx][yy])
            {
                vis[xx][yy] = 1;
                x[cnt] = xx;
                y[cnt++] = yy;
                dfs(xx, yy);
                cnt--;
                vis[xx][yy] = 0;
            }
        }
    }
    
    /*void dfs2(int xxx, int yyy, int num)
    {
        if (flag == false) return;
        if (num == n*m)
        {
            for (int i=0; i<cnt; ++i)
            {
                cout << char(y[i]+'A') << char(x[i]+'1');
            }
            cout << endl << endl;
            flag = false;
            return;
        }
    
        for (int i=0; i<8; ++i)
        {
            int xx = xxx+dx[i];
            int yy = yyy+dy[i];
            if (xx>=0 && xx<n && yy>=0 && yy<m && !vis[xx][yy])
            {
                vis[xx][yy] = 1;
                x[num] = xx;
                y[num] = yy;
                dfs2(xx, yy, num+1);
                vis[xx][yy] = 0;
            }
        }
    }*/
    
    int main()
    {
        int t;
        cin >> t;
        int casee = 0;
        while(t--)
        {
            casee++;
            cin >> n >> m;
            flag = true;
            cout << "Scenario #" << casee << ':' << endl;
            for (int j=0; j<m; ++j)
            {
                for (int i=0; i<n; ++i)
                {
                    memset(vis, 0, sizeof(vis));
                    memset(x, 0, sizeof(x));
                    memset(y, 0, sizeof(y));
                    vis[i][j] = 1;
                    x[0] = i;
                    y[0] = j;
                    cnt = 1;
                    dfs(i, j);
                    //dfs2(i, j, 1);
                    if (!flag) break;
                }
                if (!flag) break;
            }
            if (flag)
            cout << "impossible
    
    ";
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Neditor 2.1.16 发布,修复缩放图片问题
    Neditor 2.1.16 发布,修复缩放图片问题
    每日 30 秒 ⏱ 强风吹拂
    每日 30 秒 ⏱ 强风吹拂
    Python3的日期和时间
    内置函数:exec、eval、compile
    内置函数:zip、filter、map、stored
    匿名函数
    列表推导式和生成器表达式
    生成器send的用法案例
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4726505.html
Copyright © 2020-2023  润新知