面对这种题,自己是一点思路也没有,只好看别的大神的代码了,看了很多,感到转载的这个思路很简单很赞
http://blog.csdn.net/heaven13483/article/details/8284572
Problem Description
du熊这几天使劲的往一个n 行n列的矩阵填0和1这两个数字,n为偶数,而且矩阵由里向外分成了n / 2层。比如n = 6时,矩阵的分层如下:
du熊填数时有一个要求:不能存在两个相邻的1,且位于不同的层(这里的相邻指两格子共用一条线)。
请你帮du熊计算一下有多少种填法。
Input
输入包含多组测试数据,每组数据包含一个偶数n (2 <= n <= 500)。
Output
请计算并输出对2012取余后的结果。
Sample Input
2
4
Sample Output
16
1952
Hint
当n = 4时
1011
0100
0100
0000
是满足要求的
1111
0100
0100
0000
是不满足要求的,因为第一行第二列的1和第二行第二列的1相邻且位于不同的层。
后来想到的解法,,对n层,,则四个角上的不用考虑,,则将剩余的部分在中间用十字平均分成四部分
如上图中6层的数组,,划分成的左上角为,,则只需要一个一个分别看,,又分为。。
和
,,,
则可以分别看成3个元素的数组,,填充0和1,但1不能相邻,,
5个元素的数组,,填充0和1,但1不能相邻,,
同理,,n个元素的数组,,填充0和1,但1不能相邻,,各类共的有,,3*2^[(n-1)/2]-1种。。以此类推,,,即可完成,,晚了,,程序找时间补上。。
想想还是补上吧。。省得忘记补充。。
- #include <iostream>
- using namespace std;
- int main()
- {
- int n;
- cin>>n;
- int x=16;
- for (int i = n-1;i>2;i-=2)
- {
- int num = 2;
- for (int j = 1;j<(i-1)/2;j++)
- {
- num *= 2;
- }
- x = x*(3*num -1)*(3*num -1)*(3*num -1)*(3*num -1);
- }
- cout<<x%2012;
- return 0;
- }