花花公子

7 篇文章 0 订阅

一个3*5的矩阵

至少连续3个列都出现同一个卡牌算赢, 无视位置

比如:

1 0 0 0 0 

0 1 0 0 0

0 0 1 0 0

思路: 先计算所有不算位置 , 而能赢的全排列数据

 

 

#define Row 3
#define Line 5
int main(int argc, char* argv[])
{
    using namespace std;
    // 1  ~ 10  分别代表10张不同的牌, 3 * 5 的矩阵
    //计算所有能赢的组合, 不包含位置信息
    // 至少连续 3个位置才算赢
    /*
        0 1 0 0 0
        1 0 0 0 0
        0 0 1 0 0
        如此就算赢, 其他所有是0的都是垃圾数据, 无法连续在一起
    */
    int count = 0;
    int cards[Row * Line] = {0};

    for(int row1 =  1 ; row1 <= 10 ; ++row1){
        for(int i = 5 ; i >= 3; --i){
            memset(cards, 0 , Line); //建立第一行
            memset(cards, row1 , i);// 11111 , 11110 , 11100

            //开始建立第二行数据, 从1 ~ 10 的全排列
            for(int row2 = 0 ; row2 <= 10 ; ++row2){
                int row2_count = 3;
                int set_count2 = i;
                //第二行的牌如果跟第一行相等,又有 i 种线路
                /*
                  11100                     -    11111
                  10000 ~ 00100       -    10000   ~ 00001
                */
                if(row2 == row1)
                    row2_count = 1;
                else if ( row2 == 0){
                    row2_count = 0;
                    set_count2 = 0;
                }
                for(; set_count2 >= row2_count ; --set_count2){
                    memset(cards+ Line , 0, Line); //建立第二行
                    memset(cards+ Line, row2 , set_count2);


                    //开始建立第三行 , 与第二行一样
                    for(int row3 = 0 ; row3 <= 10 ; ++row3){
                        int row3_count = 3;
                        int set_count3 = set_count2;
                        if(row3 == row2){
                            row3_count = 1;
                        }
                        else if(row3 == 0){
                            row3_count = 0;
                            set_count3 = 0;
                        }
                        for(; set_count3 >= row3_count ; --set_count3){
                            memset(cards+ Line*2 , 0, Line);
                            memset(cards+Line * 2, row3, set_count3);
                            ++count;
                        }
                    }

                }

            }

        }
    }

    cout << count << endl;

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值