• 蓝桥杯 方格填数 DFS 全排列 next_permutation用法


    如下的10个格子(参看【图1.jpg】)

    填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)

    一共有多少种可能的填数方案?

    请填写表示方案数目的整数。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
     
    #include <iostream>
    #include <cmath>
    #include <fstream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int INF = 10000000;
    const int ROW = 3, COL = 4;
    int dir[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1},
                     {1, 0}, {1, -1}, {0, -1}, {-1, -1}};
    int ans;
    bool used[ROW][COL];
    int maze[ROW][COL];
    void input();
    bool check( int r, int c);
    bool judge(int r, int c);
    void solve();
    int a[10] = {0, 1, 2, 3, 4 ,5 , 6, 7 ,8 ,9};
    
    void input()
    {
        maze[0][0] = maze[2][3] = INF;    
        memset(used, false, sizeof(used));
    }
    
    bool judge(int r, int c)
    {
        return (r >= 0 && r < 3) && (c >= 0 && c < 4);
    }
    
    //判断 
    bool check(int r, int c)
    {
        if (r == 0 && c == 0) return false;
        if (r == 2 && c == 3) return false;
        for (int k = 0; k < 8; k++) {
            int nx = r + dir[k][0], ny = c + dir[k][1];
            if (judge(nx, ny) && abs(maze[nx][ny] - maze[r][c]) == 1) {
                    return false;
                }
        }
        return true;
    }
    
    void solve()
    {
        input();
        do {
            int i, j;
         //这里就是 把全排列形成的数字, 按照 如此放在格子中
         // INF 0 0 0 
            //  0  0  0 0
           //  0  0  0 INF
           for (i = 1; i < COL; i++) {
                maze[0][i] = a[i-1];
            }
            for (j = 0; j < COL; j++) {
                maze[1][j] = a[COL + j - 1];
            }
            for (j = 0; j < COL - 1; j++) {
                maze[2][j] = a[COL * 2 + j - 1];
            }
    
            int flag = true;
            for (i = 0; i < ROW; i++) {
                for (j = 0; j < COL; j++) {
                    if (!check(i, j) && (i != 0 || j != 0) && (i != 2 || j != 3)) {
                        flag = false;
                        goto num;
                    }
                }
            }
            num:
            if (flag) {
                ans++;
            }
        } while (next_permutation(a, a + 10));
    
        cout << ans << endl;
    }
    
    int main()
    {
        solve();
        return 0;    
    }
    //使用全排列,将不同组合的数字,分别放到10个格子中。
    
    //然后对10个格子枚举,判断每个格子的周围是否有与之连续的数字,有则跳出整个循环,可以使用goto,会简单些
    
    //判断完10个格子都没有相邻数字重复的,则说明,方案数++
    
     
  • 相关阅读:
    Python基础05
    Python基础04
    Python基础03
    Python基础02
    Python基础01
    软件测试
    深入了解软件测试基础04
    深入了解软件测试基础03
    深入了解软件测试基础02
    深入了解软件测试基础01
  • 原文地址:https://www.cnblogs.com/douzujun/p/6669303.html
Copyright © 2020-2023  润新知