zoukankan      html  css  js  c++  java
  • [蓝桥杯2017初赛]方格分割

    题目描述

    6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。 

    试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。 

    输出

    输出一个整数表示答案

    题解:

      观察可以知道,分界线上的点在图案上是关于点(3,3)对称的,所以从这个点开始向四个方向搜索,

      因为上下方向是对称的,搜的时候会重复计算。左右方向同理,所以最后结果要除以4

    答案:509

    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<set>
    #include<string.h>
    using namespace std;
    
    int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
    int vis[10][10];
    int ans = 0;
    void dfs(int x, int y)
    {
        if(x == 0 || y == 0 || x == 6 || y == 6)//搜索到边界位置
        {
            ans++;
            return ;
        }
        for(int i = 0; i < 4; i++)
        {
            int x1 = x + dir[i][0];
            int y1 = y + dir[i][1];
            
            int x2 = 6 - x1;//对称方向
            int y2 = 6 - y1;
            
            if(x1 >= 0 && y1 >= 0 && x1 <= 6 && y1 <= 6)
            {
                if(!vis[x1][y1])//点是对称的,判断一个即可
                {
                    vis[x1][y1] = vis[x2][y2] = 1;
                    dfs(x1,y1);
                    vis[x1][y1] = vis[x2][y2] = 0;//回溯
                }
            }
        }
    }
     
     
    int main(){
        memset(vis, 0, sizeof(vis));
        vis[3][3] = 1;
        dfs(3,3);
        printf("%d
    ",ans/4);//上下方向是对称的,搜的时候会重复计算,左右方向同理,所以最后结果要除以4
        
        return 0;
    }
  • 相关阅读:
    Python基础笔记(五)
    Python基础笔记(四)
    Python基础笔记(三)
    Python基础笔记(二)
    Python基础笔记(一)
    分页存储过程
    MD Test
    vue路由的配置技巧
    Echarts的使用与配置项
    js中call,apply,bind之间的区别
  • 原文地址:https://www.cnblogs.com/-citywall123/p/12325896.html
Copyright © 2011-2022 走看看