方格分割

蓝桥杯历年省赛真题汇总及题目详解

2017年第八届蓝桥杯省赛试题详解

标题:在这里插入图片描述
在这里插入图片描述在这里插入图片描述
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。

如图:p1.png, p2.png, p3.png 就是可行的分割法。

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

请提交该整数,不要填写任何多余的内容或说明文字。
思路:从中心兵分两路,沿线直到抵达边境,就算是一种结果,dfs

#include<iostream>
using namespace std;
#define n 6
int board[n+1][n+1];
int cou =0;   //表示对称图形个数
struct coor{
    int i;
    int j;
};

coor direct1[4]= {{-1,0},{1,0},{0,-1},{0,1}},direct2[4] = {{1,0},{-1,0},{0,1},{0,-1}};
/*
答案509
思路:1、首先初始化棋盘未走过为0
      2、分析第一部分上下左右{(-1,0),(1,0),(0,-1),(0,1)}对称于第二部分下上右左{(1,0),(-1,0),(0,1),(0,-1)}
      3、两部分分别向四方进行试探,如果某方都没有走过则可将下一步置1,然后继续进行递归
*/

 void init()
 {
     for(int i=0;i<=n;i++)   //初始化棋盘
     {
         for(int j=0;j<=n;j++)
         {
             board[i][j] = 0;
         }
     }
     board[3][3] = 1;
 }

 bool check(coor next1,coor next2)   //检查此位置是否可以走,如果可以返回true
 {
     if(board[next1.i][next1.j] == 0&&board[next2.i][next2.j] == 0)
     {
         if(next1.i ==next2.i&&next1.j == next2.j){
             return false;
         }
         return true;
     }
     return false;
 }

void DFS(coor part1,coor part2)
{
    if(part1.i == 0||part1.j == 0||part1.j == n||part1.i == n)
    {
        ++cou;
        return ;
    }
    coor next1,next2;
    for(int i=0;i<4;i++)
    {
        next1.i= part1.i+direct1[i].i;
        next1.j= part1.j+direct1[i].j;
        next2.i= part2.i+direct2[i].i;
        next2.j= part2.j+direct2[i].j;

        if(check(next1,next2))
        {
            board[next1.i][next1.j] = board[next2.i][next2.j] = 1;//表示已经被走
            DFS(next1,next2);
            board[next1.i][next1.j] = board[next2.i][next2.j] = 0;
        }
    }
}

int main()
{
    coor start1,start2;
    start1.i = start1.j = 3;
    start2.i = start2.j = 3;
    init();
    DFS(start1,start2);
    cout<<cou/4;
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值