Niuke 练习赛19 托米航空公司 搜索

托米老师靠才华与颜值发家致富后,开了一家航空公司,公司的口号是“您想飞,我们便做您的翅膀~让您每次飞行都有独特的体验!”
但是现在有一个小小的问题需要解决,托米家的飞机每排有M个座位,有N排座位。因此座椅形成了M × N的网格(忽略过道),公司为每次航班都出售K张票。
为了满足口号中的“翅膀”部分,座位必须遵守以下规则:座位被占用时,座位正前方和座位后方的座位以及当前座位左边和右边必须是空的(大概是因为这个飞机会很大吧,boss就是这么任性哼)。
然后为了满足口号中的“独特体验”部分。公司则是对每一趟航班飞机的座位采取不同的安排,如果这一趟的某个座位是占用的,而另一趟的座位是空的,则这两趟飞机座位安排是不同的。
给你三个数字M,N和K。
现在需要从这些座位中选出k个合法的座位。由于这个数字可能非常大,我们只求它对420047取模的结果。

输入描述:

输入的第一行包含一个整数T,表示指定测试用例的数量。
每个测试用例前面都有一个空白行。
每个测试用例由包含三个整数M,N和K的一行组成。

输出描述:

对于每个测试用例输出一行,表示答案对420047取模的结果。
示例1

输入

复制
3

2 3 2

2 4 4

2 5 1

输出

复制
8
2
10

备注:

T≤10

N*M<=80, K<=4


题解:

由于数据很小直接搜索即可

代码:

#include<bits/stdc++.h>
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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值