首页 > 其他 > 详细

【蓝桥杯】拼图 CSP 201409-5 拼图问题【70分】

时间:2020-05-10 17:40:29      阅读:95      评论:0      收藏:0      [点我收藏+]


//第i列,枚举到了第j行,当前状态是state,对下一列的影响是nex
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
const int MOD=1000000007;
using namespace std;

int N, M;
long long dp[1006][1000];

void dfs(int i,int j,int state,int nex)
{
if (j==M)
{
dp[i+1][nex]+=dp[i][state];
dp[i+1][nex] %=MOD;
return;
}
//如果这个位置已经被上一列所占用,直接跳过
if (((1<<j)&state)>0)
dfs(i,j+1,state,nex);


if (((1<<j)&state)==0&&(j+1)<M&&((1<<j)&nex)==0&&((1<<(j+1))&nex)==0) ///
dfs(i,j+1,state,nex|(1<<j)|(1<<(j+1)));

if (j+1<M && ((1<<j)&state)==0 &&((1<<(j+1))&state)==0&& ((1<<j)&nex)==0) ///
dfs(i,j+2,state,nex|(1<<j));

if (((1<<j)&state)==0&&j>=1&&(nex&(1<<j))==0&&(nex&(1<<(j-1)))==0) //_|
dfs(i,j+1,state,nex|(1<<j)|(1<<(j-1)));


if (j+1<M && ((1<<j)&state)==0 &&((1<<(j+1))&state)==0&& ((1<<(j+1))&nex)==0)// 7
dfs(i,j+2,state,nex|(1<<(j+1)));

return;
}

int main()
{
cin>>N>>M;
memset(dp,0,sizeof(dp));

dp[1][0]=1;
for (int i=1;i<=N;i++)
{
for (int j=0;j<(1<<M);j++)
if (dp[i][j])
{
dfs(i,0,j,0);
}
}
cout<<dp[N+1][0]<<endl;

}

【蓝桥杯】拼图 CSP 201409-5 拼图问题【70分】

原文:https://www.cnblogs.com/MAX-ZMY/p/12863637.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!