0
点赞
收藏
分享

微信扫一扫

蓝桥别Java习题练习:方格分割


目录

  • ​​🍋题目描述​​
  • ​​🍋解题思路​​
  • ​​🍋源代码​​
  • ​​🍋其他真题​​

🍋题目描述

6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。

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

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

请提交该整数,不要填写任何多余的内容或说明文字。

蓝桥别Java习题练习:方格分割_eclipse


蓝桥别Java习题练习:方格分割_java_02


蓝桥别Java习题练习:方格分割_蓝桥杯_03

🍋解题思路

我们看到这道题,首先以为是在格子里面做标记来做题。实际上这样很麻烦。我们应当是线段交点标记来做题。

以最中间的交点(3,3)为基点进行移动。有两个指针,两指针行走的方向必相反。最终把格子分成对称的两块。

蓝桥别Java习题练习:方格分割_逆波兰表达式_04


看到有题目提示“注意:旋转对称的属于同一种分割法。”。那么,最终答案应该要除于4。因为一个图形,旋转4个90度,都是一样的。

  • 答案:509

🍋源代码

public class Main {
static int ans;//答案变量
static int[][] dire={ {-1,0},{1,0},{0,-1},{0,1} };//四个方向
static int[][] vis=new int[7][7];//0~6

static void dfs(int x,int y) {
if(x==0||y==0||x==6||y==6) {//满足条件的,就ans++
ans++;
return;
}
//当前的点标注为已访问
vis[x][y]=1;
//对称点也标注为已访问
vis[6-x][6-y]=1;
for(int k=0;k<4;k++) {
int nx=x+dire[k][0];
int ny=y+dire[k][1];
//新坐标
if((nx < 0)|| nx> 6||ny<0||ny>6) continue;
if(vis[nx][ny]==0) {
dfs(nx,ny);
}
}
//回溯
vis[x][y]=0;
vis[6-x][6-y]=0;
}

public static void main(String[] args) {
dfs(3,3);
System.out.println(ans/4);
}
}

举报

相关推荐

0 条评论