作者:DD906114329 | 来源:互联网 | 2023-05-19 01:08
托米老师靠才华与颜值发家致富后,开了一家航空公司,公司的口号是“您想飞,我们便做您的翅膀~让您每次飞行都有独特的体验!”但是现在有一个小小的问题需要解决,托米家的飞机
托米老师靠才华与颜值发家致富后,开了一家航空公司,公司的口号是“您想飞,我们便做您的翅膀~让您每次飞行都有独特的体验!”
但是现在有一个小小的问题需要解决,托米家的飞机每排有M个座位,有N排座位。因此座椅形成了M × N的网格(忽略过道),公司为每次航班都出售K张票。
为了满足口号中的“翅膀”部分,座位必须遵守以下规则:座位被占用时,座位正前方和座位后方的座位以及当前座位左边和右边必须是空的(大概是因为这个飞机会很大吧,boss就是这么任性哼)。
然后为了满足口号中的“独特体验”部分。公司则是对每一趟航班飞机的座位采取不同的安排,如果这一趟的某个座位是占用的,而另一趟的座位是空的,则这两趟飞机座位安排是不同的。
给你三个数字M,N和K。
现在需要从这些座位中选出k个合法的座位。由于这个数字可能非常大,我们只求它对420047取模的结果。
输入描述:
输入的第一行包含一个整数T,表示指定测试用例的数量。
每个测试用例前面都有一个空白行。
每个测试用例由包含三个整数M,N和K的一行组成。
输出描述:
对于每个测试用例输出一行,表示答案对420047取模的结果。
备注:
T≤10
N*M<=80, K<=4
题解:
由于数据很小直接搜索即可
代码:
#include
using namespace std;
const int maxn = 100;
int n,m,k;
int ans;
int maze[maxn][maxn];
//const int dir[4][2] = {1,0,0,1,-1,0,0,-1};
void dfs(int pos,int cnt)
{
if(cnt == k) {
ans++;
return;
}
if(pos == n*m+1) return;
int x = (pos - 1) / m + 1,y = (pos - 1) % m + 1;
// printf("%d %d %d\n",pos,x,y);
if(!maze[x-1][y] && !maze[x+1][y] && !maze[x][y+1] && !maze[x][y-1]){
maze[x][y] = 1;
dfs(pos+1,cnt+1);
}
maze[x][y] = 0;
dfs(pos+1,cnt);
}
int main()
{
int caset;scanf("%d",&caset);
while(caset--) {
scanf("%d%d%d",&n,&m,&k);
ans = 0;
memset(maze,0,sizeof(maze));
dfs(1,0);
printf("%d\n",ans % 420047);
}
return 0;
}