2017第八届蓝桥杯省赛Java A组--方格分割
2018-03-20 20:01
302 查看
标题:方格分割
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
请提交该整数,不要填写任何多余的内容或说明文字。
![](//img-blog.csdn.net/20180320195349895?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3h1eWFuZ3hpbmxlaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
根据观察并证明,必然有第一行或最后一行或第一列或最后一列被选中,由于需要排除旋转对称的情况,可将第一行视为默认被选中,即对称格子--最后一行不能被选中。
那么只需要在第二行至第五行的24个格子中,选中12个格子,并且两两不能是对称格。
再用走迷宫的dfs算法,判断选中的18个格子是否相连,若相连,则res++;public class Main{
static int[] num = new int[36];
static int step=1;
static int[] flag = new int[36];
static int res = 0;
public static void main(String[] args) {
for(int i=0;i<6;i++){
num[i] = 1;
}
flag[0] =1;
fun(0,6);
System.out.println(res);
}
static void fun(int n,int next){
if(n==12){
step = 1;
flag = new int[36];
flag[0] = 1;
dfs(0);
if(step==18) res++;
return;
}
for(int i=next;i<30;i++){
if(duicheng(i)){
num[i] = 1;
fun(n+1,i+1);
num[i] = 0;
}
}
}
static boolean duicheng(int i){//对称格子是否被选
if(num[35-i]==0) return true;
return false;
}
static void dfs(int n){//走迷宫算法,通过行走的步数step判断是否18格子相连
if(n!=5&&n!=11&&n!=17&&n!=23&&n!=29&&num[n+1]==1&&flag[n+1]==0){
step++;
flag[n+1] = 1;
dfs(n+1);
//flag[n+1] = 0;
}
if(n<=23&&num[n+6]==1&&flag[n+6]==0){
step++;
flag[n+6] = 1;
dfs(n+6);
//flag[n+6] = 0;
}
if(n>=6&&num[n-6]==1&&flag[n-6]==0){
step++;
flag[n-6] = 1;
dfs(n-6);
//flag[n-6] = 0;
}
if(n!=0&&n!=6&&n!=12&&n!=18&&n!=24&&num[n-1]==1&&flag[n-1]==0){
step++;
flag[n-1] = 1;
dfs(n-1);
//flag[n-1] = 0;
}
}
}
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法。
请提交该整数,不要填写任何多余的内容或说明文字。
根据观察并证明,必然有第一行或最后一行或第一列或最后一列被选中,由于需要排除旋转对称的情况,可将第一行视为默认被选中,即对称格子--最后一行不能被选中。
那么只需要在第二行至第五行的24个格子中,选中12个格子,并且两两不能是对称格。
再用走迷宫的dfs算法,判断选中的18个格子是否相连,若相连,则res++;public class Main{
static int[] num = new int[36];
static int step=1;
static int[] flag = new int[36];
static int res = 0;
public static void main(String[] args) {
for(int i=0;i<6;i++){
num[i] = 1;
}
flag[0] =1;
fun(0,6);
System.out.println(res);
}
static void fun(int n,int next){
if(n==12){
step = 1;
flag = new int[36];
flag[0] = 1;
dfs(0);
if(step==18) res++;
return;
}
for(int i=next;i<30;i++){
if(duicheng(i)){
num[i] = 1;
fun(n+1,i+1);
num[i] = 0;
}
}
}
static boolean duicheng(int i){//对称格子是否被选
if(num[35-i]==0) return true;
return false;
}
static void dfs(int n){//走迷宫算法,通过行走的步数step判断是否18格子相连
if(n!=5&&n!=11&&n!=17&&n!=23&&n!=29&&num[n+1]==1&&flag[n+1]==0){
step++;
flag[n+1] = 1;
dfs(n+1);
//flag[n+1] = 0;
}
if(n<=23&&num[n+6]==1&&flag[n+6]==0){
step++;
flag[n+6] = 1;
dfs(n+6);
//flag[n+6] = 0;
}
if(n>=6&&num[n-6]==1&&flag[n-6]==0){
step++;
flag[n-6] = 1;
dfs(n-6);
//flag[n-6] = 0;
}
if(n!=0&&n!=6&&n!=12&&n!=18&&n!=24&&num[n-1]==1&&flag[n-1]==0){
step++;
flag[n-1] = 1;
dfs(n-1);
//flag[n-1] = 0;
}
}
}
相关文章推荐
- 2017第八届蓝桥杯省赛-大学A组 方格分割(深搜dfs)
- 蓝桥杯第八届省赛JAVA真题----方格分割
- 2017第八届蓝桥杯 04 承压计算(java)
- 第八届蓝桥杯第四题:方格分割
- 2017第八届蓝桥杯省赛Java A组--正则问题
- 2017第八届蓝桥杯 03 纸牌三角形(java)
- 蓝桥杯第八届_方格分割
- 2017第八届蓝桥杯 07 Excel地址(java)
- 2017第八届蓝桥杯省赛Java A组--取球博弈
- 2017第八届蓝桥杯省赛Java A组--最大公共子串
- 2017第八届蓝桥杯 05 杨辉三角(java)
- 2017第八届蓝桥杯省赛Java A组--迷宫
- 2017第八届蓝桥杯省赛Java A组--9数算式
- 2017第八届蓝桥杯省赛Java A组--迷宫
- 方格分割-第八届蓝桥杯c/c++组
- 2017第八届蓝桥杯 02 兴趣小组(java)
- 2017第八届蓝桥杯 06 最大公共子串(java)
- 2017第八届蓝桥杯省赛Java A组--9数算式
- 2017第八届蓝桥杯省赛Java A组--字母组串
- 蓝桥杯 2017java组方格取数