我是靠谱客的博主 朴实玉米,最近开发中收集的这篇文章主要介绍染色问题(n个格子,3种颜色),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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


递推公式:

A1 = 3

A2 = 6 //A(3,2)=6

A3 = 6 //A(3,3)=6

An=2*A(n-2)+A(n-1), n>=4


证明:

考虑第n-1个格子:

1. 如果这个格子和第1个格子颜色不同,那么第n个格子只有1种选择,前n-1个格子的选择就是A(n-1),此时n个格子的选择是1*A(n-1)

2. 如果这个格子和第1个格子颜色相同,那么第n个格子只有2种选择,前n-2个格子的选择就是A(n-2),此时n个格子的选择时2*A(n-2)

所以有An=2*A(n-2)+A(n-1), n>=4

remak: 因为我们是考虑第n-1个格子,该格子和第1个格子的颜色可能相同也可能不同,所以n>=4才可以。不然n=3的话,第n-1=3-1=2个格子和第一个格子的颜色必然不同了,就没有上面这2种情况了,所以要从n>=4开始推导。


具体题目可参见HDUOJ 2045题,代码如下:

#include <iostream>
#include <iomanip>
#include <cmath>
#define PI 3.1415927
using namespace std;
long long func(int n) {
long long num[51]={0};
num[0]=3;
num[1]=6;//A(3,2)
num[2]=6;//A(3,3)
for(int i=3; i<n; i++) {//for n=i, condition on (i-1)th color
num[i]=num[i-1]+2*num[i-2];
}
return num[n-1];
}
int main()
{
int n;
while(cin >> n) {
cout << func(n) << endl;
}
return 0;
}




最后

以上就是朴实玉米为你收集整理的染色问题(n个格子,3种颜色)的全部内容,希望文章能够帮你解决染色问题(n个格子,3种颜色)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部