首页 > 其他 > 详细

如何解决一道用最小步数处理字符串折叠问题?

时间:2021-04-02 17:41:10      阅读:24      评论:0      收藏:0      [点我收藏+]

突然想到一个数学问题,一串数字经过折叠后,可能会出现连连看的情况,那么如何用最小步数判断这串数字经过不同的折叠后有多少种会出现连连看的情况?

#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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!