• 剪邮票



    如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。
    (仅仅连接一个角不算相连)
    比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

    请你计算,一共有多少种不同的剪取方法。
    请填写表示方案数目的整数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
    答案7 (19分)

    先选择五个数共有792种选法,然后判断五个数是否连通。共116种。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <iomanip>
    
    using namespace std;
    int v[13],s[6],c,e;
    int check()
    {
        int flag = 0;
        for(int i = 1;i <= 5;i ++)
        {
            int d = 0;
            for(int j = 1;j <= 5;j ++)
            {
                if(s[i] == s[j])continue;
                if(s[i] + s[j] != 9 && s[i] + s[j] != 17 && abs(s[j] - s[i]) == 1 || abs(s[j] - s[i]) == 4)
                {
                    d ++;
                }
            }
            if(!d)return 0;
            flag += d;
        }
        if(flag >= 8)return 1;
        return 0;
    }
    void dfs(int k)
    {
        if(k >= 6)
        {
            if(check())c ++;
            for(int i = 1;i <= 5;i ++)
            {
                cout<<s[i]<<' ';
            }
            cout<<endl<<check()<<endl;
            return;
        }
        for(int i = s[k - 1] + 1;i <= 12;i ++)
        {
            if(!v[i])
            {
                v[i] = 1;
                s[k] = i;
                dfs(k + 1);
                v[i] = 0;
            }
        }
    }
    int main()
    {
        dfs(1);
        cout<<c;
    }

    选择五个位置,标记为1,然后从一个位置出发计算连通1的个数,如果是5满足情况。 

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cstdlib>
    #include <cstdio>
    using namespace std;
    int c;
    int mp[3][4],t[3][4];
    int dir[4][2] = {0,1,1,0,0,-1,-1,0};
    int get(int x,int y) {
        t[x][y] = 0;
        int ans = 1;
        for(int i = 0;i < 4;i ++) {
            int tx = x + dir[i][0];
            int ty = y + dir[i][1];
            if(tx < 0 || ty < 0 || tx >= 3 || ty >= 4 || !t[tx][ty]) continue;
            ans += get(tx,ty);
        }
        return ans;
    }
    void dfs(int k,int d) {
        if(k >= 5) {
            for(int i = 0;i < 3;i ++) {
                for(int j = 0;j < 4;j ++) {
                    t[i][j] = mp[i][j];
                }
            }
            if(get(d / 4,d % 4) == 5) c ++;
            return;
        }
        for(int i = d + 1;i < 12;i ++) {
            int x = i / 4,y = i % 4;
            mp[x][y] = 1;
            dfs(k + 1,i);
            mp[x][y] = 0;
        }
    }
    int main() {
        dfs(0,-1);
        printf("%d",c);
    }
  • 相关阅读:
    android -------- Data Binding的使用(二)
    牛客网-《剑指offer》-数值的整数次方[快速幂运算]
    牛客网-《剑指offer》-二进制中1的个数
    牛客网-《剑指offer》-矩形覆盖
    牛客网-《剑指offer》-变态跳台阶
    牛客网-《剑指offer》-跳台阶
    牛客网-《剑指offer》-斐波那契数列
    牛客网-《剑指offer》-旋转数组的最小数
    牛客网-《剑指offer》-用两个栈实现队列
    牛客网-《剑指offer》-重建二叉树
  • 原文地址:https://www.cnblogs.com/8023spz/p/8421865.html
Copyright © 2020-2023  润新知