题2 棋子
【问题描述】
小Z在家闲得无聊,摆弄起了围棋棋子。也许是小Z有自虐倾向,他出了个难题给自己,结果竟然把自己难住了。你作为他的朋友,决定帮助他解决难题。
有一个m×n的棋盘,需要在上面摆满黑白棋子。小Z有一个奇怪的规则:如果有两个棋子相邻(上下左右),且一白一黑,则黑的必须在上面(或左边)。黑白棋子都是足够多的。小Z想知道共有多少种不同的摆法(只要略有不同就算一种)。
【输入】
输入文件chessman.in的共一行,包括2个正整数m和n。
【输出】
输出文件chessman.out共一行,包括一个正整数ans,表示共有多少种不同的摆法。
【输入输出样例】
chessman.in | chessman.out |
2 2 | 6 |
【输入输出样例解释】
6种摆法分别为:
oo ** ** *o ** *o
oo ** oo *o *o oo
(*表示黑子,o表示白子)
【限制】
50%的数据满足: 2<=m,n<=16
100%的数据满足: 2<=m,n<=30
以下为代码
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long f[100][100];
int main()
{
freopen("chessman.in","r",stdin);
freopen("chessman.out","w",stdout);
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
{
if(i==1||j==1)f[i][j]=i+j;
}
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
{
if(i!=1&&j!=1)
{
f[i][j]=f[i-1][j]+f[i][j-1];
}
}
cin>>n>>m;
cout<<f[n][m];
return 0;
}
(嘘,说实话,这题找找数学规律就好了,杨辉三角,不要要什么高深算法,本人的爱好就是简单化,尽可能地不用子函数或算法)