本文主要是介绍Hua Rong Dao FZU - 2107(dfs),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
F - Hua Rong Dao
题目链接:FZU - 2107
题意, 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;
}
这篇关于Hua Rong Dao FZU - 2107(dfs)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!