突然想到一个数学问题,一串数字经过折叠后,可能会出现连连看的情况,那么如何用最小步数判断这串数字经过不同的折叠后有多少种会出现连连看的情况?
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
const int lenth = 16;
int main()
{
srand(time(NULL));
int a[1000][1000];
int b[lenth];
for(int i = 0;i < lenth;++i) {
b[i] = rand()%10;
}
int temp1, temp2, r;
bool success = false;
int count = 0;
for(int j = 2;;++j) {
temp1 = b[j] / j;
if(temp1 <= 1) {
cout << count << endl;
break;
}
temp2 = b[j] % 2;
if(temp2 > 0) {
r = j + 1;
}
for(int k = 0;k < 1000;++k) {
for(int l = 0;l < 1000;++l) {
a[k][l] = 0;
}
}
for(int k = 0;k < r;++k) {
if(r == j) {
for(int l = 0;l < temp1;++l) {
a[k][l] = b[l];
}
}
else if(r > j) {
if(k < j) {
for(int l = 0;l < temp1;++l) {
a[k][l] = b[l];
}
}
else {
for(int l = 0;l < temp2;++l) {
a[k][l] = b[l];
}
}
}
}
for(int k = 0;k < r;++k) {
if(r == j) {
for(int l = 0;l < temp1;++l) {
if(k + 1 < r && l + 1 < temp1 && 0 < k - 1 && l - 1 > 0) {
if(a[k][l] == a[k + 1][l] || a[k][l] == a[k - 1][l] ||
a[k][l] == a[k][l - 1] || a[k][l] == a[k][l + 1] ||
a[k][l] == a[k + 1][l + 1] || a[k][l] == a[k - 1][l - 1]) {
success = true;
break;
}
}
}
if(success == true) {
++count;
break;
}
}
else if(r > j) {
if(k < j) {
for(int l = 0;l < temp1;++l) {
if(k + 1 < r && l + 1 < temp1 && 0 < k - 1 && l - 1 > 0) {
if(a[k][l] == a[k + 1][l] || a[k][l] == a[k - 1][l] ||
a[k][l] == a[k][l - 1] || a[k][l] == a[k][l + 1] ||
a[k][l] == a[k + 1][l + 1] || a[k][l] == a[k - 1][l - 1]) {
success = true;
break;
}
}
}
if(success == true) {
++count;
break;
}
}
}
else {
for(int l = 0;l < temp2;++l) {
if(k + 1 < j && l + 1 < j && 0 < k - 1 && l - 1 > 0) {
if(a[k][l] == a[k + 1][l] || a[k][l] == a[k - 1][l] ||
a[k][l] == a[k][l - 1] || a[k][l] == a[k][l + 1] ||
a[k][l] == a[k + 1][l + 1] || a[k][l] == a[k - 1][l - 1]) {
success = true;
break;
}
}
}
if(success == true) {
++count;
break;
}
}
}
}
return 0;
}
原文:https://www.cnblogs.com/carmine/p/14610683.html