zoukankan      html  css  js  c++  java
  • RPG难题,给n格方格涂三种颜色

    有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法

    1、递归算法

    我们先不管第一格到第三格怎么涂色,我们先考虑倒数第2格,也就是第n-1格怎么涂色?

    根据题意,

    A、如果这个方格的颜色和第一个方格的颜色不同,那么第n个方格就只有1种选择(因为首尾两格也不同色),所以之前n-1个方格的涂色方法为paint(n-1),此时n个方格的涂色方法总数为paint(n-1)*1;(将第n个方格和之前的方格分成两部分)

    B、如果这个方格的颜色和第一个方格的颜色相同,那么第n个方格就有2种选择,所以之前n-1个方格的涂色方法为paint(n-2)(为什么是n-2呢?是因为前提是——“n-1的方格颜色已与第1个方格的颜色一致,第1个是什么颜色,第n-1方格就是什么颜色”,所以n-1方格的颜色不需要考虑,所以函数里传的参数是n-2)。所以,在本情况下,n个方格的涂色方法总数为2*paint(n-2)。

    上述的A、B是思考方式上的分类,说白了就是初中数学(中考最后一题)中要掌握的分类讨论思想---“要想解对题,此题的所有情况都要列出”,而不是我们C语言中,不是if就是else的互斥情况。

    综上,解决涂色问题的表达式是:方法总数=paint(n-1)*1+2*paint(n-2)

    int paint(int n)
    {
        if (n == 1)
            return 3;
        else if (n == 2 || n == 3)
            return 6;
        else
            return paint(n - 1) + 2 * paint(n - 2);
        //n-1格与第一个涂色不同(paint(n-1)) n-1格与第一格涂色相同 paint(n-2)*2
    }

    2、动态规划

    #include <iostream>
    using namespace std;
    int main()
    {
        int n;
        long long dp[51];
        dp[0] = 0;
        dp[1] = 3;
        dp[2] = 6;
        dp[3] = 6;
    
        for (int i = 4; i <= 50; i++)
        {
            dp[i] = dp[i - 1] + 2 * dp[i - 2];
        }
        cin >> n;
        cout << dp[n];
        return 0;
    }
  • 相关阅读:
    Java并发编程:线程池的使用
    AlarmManager与PendingIntent
    ConnectivityManager与检查网络连接的使用
    IntentService的使用
    Service(Local Service)简介
    Looper、Hander、HandlerThread
    XML_PULL解析
    android AsyncTask 的使用(转载)
    android 连接网络的简单实例
    xml drawable
  • 原文地址:https://www.cnblogs.com/didiaoxiaoguai/p/11602967.html
Copyright © 2011-2022 走看看