如何解决一道用最小步数处理字符串折叠问题?
突然想到一个数学问题,一串数字经过折叠后,可能会出现连连看的情况,那么如何用最小步数判断这串数字经过不同的折叠后有多少种会出现连连看的情况?
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
const int lenth = 100;
int main()
{
srand(time(NULL));
int a[1000][1000];
int b[lenth];
for(int i = 0;i < lenth;++i) {
b[i] = rand()%10;
cout << b[i] << " ";
}
cout << endl;
int temp1, temp2, r;
bool success;
int count = 0;
int n;
for(int j = 2;;++j) {
success = false;
temp1 = lenth / j;
if(temp1 <= 1) {
cout << count << endl;
break;
}
temp2 = lenth % j;
r = j;
if(temp2 > 0) {
r = j + 1;
}
for(int k = 0;k < 1000;++k) {
for(int l = 0;l < 1000;++l) {
a[k][l] = -1;
}
}
n = 0;
for(int k = 1;k <= r;++k) {
if(r == j) {
for(int l = 1;l <= temp1;++l) {
a[k][l] = b[n*temp1 + l-1];
cout << a[k][l] << " ";
}
cout << endl;
++n;
}
else if(r > j) {
if(k < r) {
for(int l = 1;l <= temp1;++l) {
a[k][l] = b[n*temp1 + l-1];
cout << a[k][l] << " ";
}
cout << endl;
++n;
}
else {
for(int l = 1;l <= temp2;++l) {
a[k][l] = b[n*temp1 + l-1];
cout << a[k][l] << " ";
}
cout << endl;
++n;
}
}
}
for(int k = 1;k <= r;++k) {
if(r == j) {
for(int l = 1;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]||
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 = 1;l <= temp1;++l) {
if(k + 1 <= j && 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]||
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 = 1;l <= temp2;++l) {
if(k + 1 <= k && l + 1 <= temp2 && 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]||
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;
}
浙公网安备 33010602011771号