F - Hua Rong Dao
题意, 4*n的格子, 放入一个2*2的格子, 若干横着的1*2的格子, 若干竖着放的2*1的格子, 若干1*1的格子, 问有几种方法使得4*n格子填满;
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
using namespace std;
int n;
bool flag, vis[5][5];
bool judge(int x, int y){
if(x<0||y<0||x>=4||y>=n||vis[x][y]) return false;
return true;
}
int ans;
void dfs(int cnt){
//cout << cnt << ' ' << n << endl;
if(cnt==4*n&&flag){
ans++;
return;
}
if(cnt>=4*n) return;
for(int i=0; i<4; i++){
for(int j=0; j<n; j++){
if(judge(i, j)&&judge(i+1, j)&&judge(i, j+1)&&judge(i+1, j+1)&&!flag){
vis[i][j]=vis[i][j+1]=vis[i+1][j]=vis[i+1][j+1]=flag=true;
dfs(cnt+4);
vis[i][j]=vis[i][j+1]=vis[i+1][j]=vis[i+1][j+1]=flag=false;
}
if(judge(i, j)&&judge(i, j+1)){
vis[i][j+1]=vis[i][j]=true;
dfs(cnt+2);
vis[i][j+1]=vis[i][j]=false;
}
if(judge(i, j)&&judge(i+1, j)){
vis[i+1][j]=vis[i][j]=true;
dfs(cnt+2);
vis[i][j]=vis[i+1][j]=false;
}
if(judge(i, j)){
vis[i][j]=true;
dfs(cnt+1);
vis[i][j]=0;
return;//注意此次return, 否则会有重复的;
}
}
}
}
int main(){
int t;
cin >> t;
while(t--){
cin >> n;
ans=0;
flag=false;
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
vis[i][j]=false;
dfs(0);
cout << ans << endl;
}
return 0;
}

686

被折叠的 条评论
为什么被折叠?



