【DP合集】棋盘 chess

给出一张 n × n 的棋盘,格子有黑有白。现在要在棋盘上放棋子,要求: 
• 黑格子上不能有棋子 
• 每行每列至多只有一枚棋子 
你的任务是求出有多少种合法的摆放方案。答案模 109+7109+7 。

Input

输入的第一行一个整数 n ( n ≤ 15) 。 
接下来一个 n × n 的棋盘( 1 表示黑 ;0 表示白)。

Output

输出一行一个整数,表示合法方案数对 109+7109+7 取模后的结果。

题解:
其实这道题可能是由炮兵阵地改的,但没原题好,反正记忆化搜索就可以了。
代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=1000000007;
string a[20];
int dp[20][1<<15],vis[20][1<<15],n;
 
void cl(){
    memset(dp,0,sizeof(dp));
    memset(vis,0,sizeof(vis));
}
 
int dfs(int now,int x){
    if(now==n) return 1;
    if(vis[now][x]) return dp[now][x];
    vis[now][x]=1;
    int ans=0;
    for(int i=0;i<n;i++){
        if((1<<i)&x || a[now][i]=='1') continue;
        ans+=dfs(now+1,x|(1<<i));
        ans%=mod;
    }
    ans+=dfs(now+1,x);
    ans%=mod;
    dp[now][x]=ans;
    return ans;
}
 
int main(){
    cl();
    scanf("%d",&n);
    for(int i=0;i<n;i++)cin>>a[i];
    printf("%d",dfs(0,0));
}

 

转载于:https://www.cnblogs.com/renjianshige/p/7192479.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是棋盘分布问题的分治法代码实现(Python): ```python def chess_board(size, x1, y1, x2, y2): """ 棋盘分布问题的分治法实现 :param size: 棋盘大小 :param x1: 特殊方格的横坐标 :param y1: 特殊方格的纵坐标 :param x2: 特殊方格的横坐标 :param y2: 特殊方格的纵坐标 """ # 如果棋盘的大小为1,直接输出 if size == 1: return # 划分棋盘 half = size // 2 # 判断特殊方格在哪个子棋盘中 in_first = (x1 < half) and (y1 < half) in_second = (x2 < half) and (y2 < half) # 如果特殊方格在第一象限和第三象限的子棋盘中 if in_first != in_second: # 输出第一象限的右下角为特殊方格 print(half, half, end=' ') # 递归处理第一象限的子棋盘 chess_board(half, x1, y1, half-1, half-1) # 递归处理第二象限的子棋盘 chess_board(half, half, half-1, x2, y2) # 递归处理第三象限的子棋盘 chess_board(half, half-1, half, x2, y2) # 递归处理第四象限的子棋盘 chess_board(half, x1, y1, half, half-1) # 如果特殊方格在第二象限和第四象限的子棋盘中 else: # 输出第二象限的左下角为特殊方格 print(half-1, half-1, end=' ') # 递归处理第一象限的子棋盘 chess_board(half, x1, y1, half-1, half-1) # 递归处理第二象限的子棋盘 chess_board(half, x1, half, half-1, y2) # 递归处理第三象限的子棋盘 chess_board(half, half, half-1, x2, y2) # 递归处理第四象限的子棋盘 chess_board(half, half-1, y1, x2, half) ``` 其中,`size`表示棋盘的大小,`x1`、`y1`表示特殊方格的坐标,`x2`、`y2`表示另一个特殊方格的坐标。 函数输出的是每个特殊方格所在子棋盘的右下角方格的坐标。例如,如果特殊方格在第一象限的子棋盘中,则输出第一象限子棋盘的右下角方格的坐标;如果特殊方格在第二象限的子棋盘中,则输出第二象限子棋盘的左下角方格的坐标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值