第八届蓝桥杯省赛 方格切割

标题:方格分割 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;
}

 

posted on 2018-03-29 20:43  九月旧约  阅读(192)  评论(0编辑  收藏  举报

导航