标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。 如图:p1.png, p2.png, p3.png 就是可行的分割法。 试计算: 包括这3种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。 请提交该整数,不要填写任何多余的内容或说明文字。
昨晚写的时候是从(1,1)开始搜的,想的是搜到第18个,然后判断对称的点是否都相等,若相等则这种情况可以,最后考完gg,想错了。
今天看了网上的博客,是从(3,3)开始同时向两边搜,当扫到边界的时候,因为是同时向反方向扫的所以两个图形是一样的,此时就是一种情况。
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <cmath> #include <map> #include <set> #define maxn 10010 #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; int vis[10][10] = {0}, ans = 0; int dx[] = {0,0,1,-1}, dy[] = {1,-1,0,0}; void dfs( int x, int y ) { if( x == 0 || y == 0 || x == 6 || y == 6 ) { ans ++; if( ans == 1 ) { for( int i = 1; i <= 6; i ++ ) { for( int j = 1; j <= 6; j ++ ) { cout << vis[i][j] << " "; } cout << endl; } } return ; } for( int i = 0; i < 4; i ++ ) { int xx = x + dx[i]; int yy = y + dy[i]; if( !vis[xx][yy] ) { vis[xx][yy] = 1; vis[6-xx][6-yy] = 1; dfs( xx, yy ); vis[xx][yy] = 0; vis[6-xx][6-yy] = 0; } } } int main() { vis[3][3] = 1; dfs( 3, 3 ); cout << ans / 4 << endl; return 0; }