標(biāo)題:方格分割
6x6的方格进肯,沿著格子的邊線剪開成兩部分。
要求這兩部分的形狀完全相同携狭。
如圖:p1.png, p2.png, p3.png 就是可行的分割法旧找。
試計(jì)算:
包括這3種分法在內(nèi),一共有多少種不同的分割方法祭衩。
注意:旋轉(zhuǎn)對(duì)稱的屬于同一種分割法灶体。
請(qǐng)?zhí)峤辉撜麛?shù),不要填寫任何多余的內(nèi)容或說明文字掐暮。
dfs 注意不是對(duì)格子進(jìn)行DFS 是對(duì)分割線進(jìn)行DFS 最后結(jié)果/4
除以4是因?yàn)?對(duì)于
000111
000111
000111
000111
000111
000111
從點(diǎn)3,3開始搜索 有兩種方法
111111
111111
111111
000000
000000
000000
這也也有兩種方法 它分割后的結(jié)果和上面是一樣的 加起來是四種
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <algorithm>
int N, M, K;
//const int MAXN = , MAXM = 0;
//typedef long long ll;
const int si = 7;
int ans = 0;
using namespace std;
int vis[si][si];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
void dfs(int x, int y) {
if (x == 0 || y == 0 || x == N || y == N) {
ans++;
return;
}
for (int i = 0; i < 4; i++) {
int a = x + dx[i];
int b = y + dy[i];
if (vis[a][b]) continue;
int ra = N - a;
int rb = N - b;
vis[a][b] = vis[ra][rb] = 1;
dfs(a, b);
vis[a][b] = vis[ra][rb] = 0;
}
}
int main() {
N = 6;
vis[3][3] = 1;
dfs(3, 3);
cout << ans / 4 <<endl;
return 0;
}