
- #include<bits/stdc++.h>
- const int N=1000000;
- using namespace std;
- bool mp[2][N];
- int cnt=0;
- int n;
- void dfs(int row,int col){
- cnt=cnt%1000000007;
- if(col==n && row==2){
- cnt++;
- return ;
- }
- if(row>=2){ //下一列
- dfs(0,col+1);
- return;
- }
-
- if(mp[row][col]==1){ //下一行
- dfs(row+1,col);
- return ;
- }
-
- //I型木块两种情况,平放和竖放
- //1.竖放
- if(row==0 && mp[row][col]==0 && mp[row+1][col]==0){
- mp[row][col]=1,mp[row+1][col]=1;
- dfs(row+2,col); //直接下一列
- mp[row][col]=0,mp[row+1][col]=0;
-
- }
- //2.横放
- if(col+1<=n &&mp[row][col]==0 && mp[row][col+1]==0){
- mp[row][col]=1 , mp[row][col+1]=1;
- dfs(row+1,col);
- mp[row][col]=0 , mp[row][col+1]=0;
- }
- //L型木块有四种可能
- //第一种
- if(row==0 && col+1<=n && mp[row][col]==0 && mp[row+1][col]==0 && mp[row+1][col+1]==0){
- mp[row][col]=1 , mp[row+1][col]=1 , mp[row+1][col+1]=1;
- dfs(row,col+1);
- mp[row][col]=0 , mp[row+1][col]=0 , mp[row+1][col+1]=0;
- }
- //第二种
- if(row==1 && col+1<=n && mp[row][col]==0 && mp[row][col+1]==0 && mp[row-1][col+1]==0) {
- mp[row][col]=1 , mp[row][col+1]=1 , mp[row-1][col+1]=1;
- dfs(row+1,col); //直接下一列
- mp[row][col]=0 , mp[row][col+1]=0 , mp[row-1][col+1]=0;
- }
- //第三种
- if(row==0 && col+1<=n && mp[row][col]==0 && mp[row+1][col]==0 && mp[row][col+1]==0){
- mp[row][col]=1 , mp[row+1][col]=1 , mp[row][col+1]=1;
- dfs(row+1,col+1);
- mp[row][col]=0 , mp[row+1][col]=0 , mp[row][col+1]=0;
- }
- //第四种
- if(row==0 && col+1<=n && mp[row][col]==0 && mp[row][col+1]==0 && mp[row+1][col+1]==0){
- mp[row][col]=1 , mp[row][col+1]=1 , mp[row+1][col+1]=1;
- dfs(row+1,col);
- mp[row][col]=0 , mp[row][col+1]=0 , mp[row+1][col+1]=0;
- }
- }
- int main(){
- cin>>n;
- //搜索方式从上到下从左到右
- dfs(0,1);
- cout<<cnt%1000000007<<endl;
- return 0;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |