[蓝桥杯2015决赛]方格填数

发布时间 2023-04-27 00:10:27作者: 车车学不完

在2行5列的格子中填入1到10的数字。
要求:相邻的格子中的数,右边的大于左边的,下边的大于上边的。
如下图所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。
image.png

分析
模拟,全排列。由于本题只需计算1到10的数字满足要求的方案,全排列复杂度为\(O(10!)\)完全是没有问题的,再根据要求判断即可。

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

int g[15];

int main()
{
    int n = 10;
    for(int i = 1; i <= n; i ++ )   g[i] = i;

    int ans = 0;
    do{
        bool ok = true;
        for(int i = 1; i <= 5; i ++ ){
            if(i == 1){
                if(g[6] < g[1]){
                    ok = false;
                    break;
                }
            }else{
                if(g[i] > g[i-1] && g[i + 5] > g[i])    continue;
                else {
                    ok =false;
                    break;
                }
            }
        }

        for(int i = 7; i <= 10 ; i ++ ){
            if(g[i] > g[i-1])   continue;
            else {
                ok = false;
                break;
            }
        }
        if(ok)  ans ++;
    }while(next_permutation(g + 1, g + n + 1));

    cout << ans << endl;
    return 0;
}