蓝桥杯真题--方格分割

题目描述:

6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。问有几种合法的分割方法??

如图,这就是一种合法的分割方法:

题目解析:第一次看这个题目,很容易想到是dfs深度优先搜索,但是并没有想到从线条的方面来做dfs,而是从方格的角度来做dfs,浪费了很长的时间。废话不多说。

这道题很简单,以图片的中心为坐标开始做dfs划线,每次划一道线,就要标记这根线和对称的那条线,直到到达方格的边界,此时就是一种合法的分割方案。

代码如下:

#include <iostream>
using namespace std;

static int number = 0;
int isvisited[7][7];
int data[7][7];
int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};

void dfs(int x,int y){
   if(x == 0||x == 6|| y == 0|| y == 6){
      number++;
      return;
   } 
   data[x][y] = 1;
   data[3-(x-3)%6][3-(y-3)%6] = 1;
   isvisited[x][y] = 1;
   isvisited[3-(x-3)%6][3-(y-3)%6] = 1;
   for(int i = 0;i < 4;i++){
      int index_x = x+dir[i][0];
      int index_y = y+dir[i][1];
      if(index_x < 0|| index_x > 6 || index_y > 6 || index_y < 0) continue;
      if(!isvisited[index_x][index_y]){
         dfs(index_x,index_y);
      }
   }
   data[x][y] = 0;
   data[3-(x-3)%6][3-(y-3)%6] = 0;
   isvisited[x][y] = 0;
   isvisited[3-(x-3)%6][3-(y-3)%6] = 0;
   return; 
}
int main(void){
   //初始化data数组
   for(int i = 0;i < 7;i++){
      for(int j = 0;j < 7;j++){
         data[i][j] = 0;
         isvisited[i][j] = 0;
      }
   }
   dfs(3,3);
   cout << number/4 << endl; 
   return 0;
}

答案:509

 

posted @ 2020-02-28 21:33  宝宝的你叔叔  阅读(292)  评论(0)    收藏  举报