蓝桥杯真题--方格分割
题目描述:
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
浙公网安备 33010602011771号