一个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;
}