方格分割 蓝桥杯心得

标题:方格分割

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

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

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

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



一开始想的是按着一个方块一个方块搜索,但是没有考虑到dfs只能是一笔画!!!所以样例的所有情况都没考虑到下面是我比赛的时候写的代码(知道结果的时候还是比较伤心的,花了大把的时间最后还是入坑了  哎  还是有待锻炼啊~~!!!):

<↓↓↓这个代码是错的哦!!!只是本人比赛时写的~~可以略过>

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<ctype.h>
 4 #include<string.h>
 5 #include<stdlib.h>
 6
 7 int aa[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
 8 int line[10][10];
 9 struct data {
10     int dis[6][6];
11 }vis[10000];
12 int sum;
13 void dfs(int x,int y,int n)
14 {
15     n++;
16     int i,j;
17     if(n>=18){
18         for(i=0;i<6;i++){
19             for(j=0;j<6;j++){
20                 vis[sum].dis[i][j]=line[i][j];
21                 //printf("%d ",line[i][j]);
22             }
23             //printf("\n");
24         }
25         //system("pause");
26         sum++;
27         return ;
28     }
29     int a,b;
30     for(i=0;i<4;i++){
31         a=x+aa[i][0];
32         b=y+aa[i][1];
33         if(a>=0&&a<6&&b>=0&&b<6&&line[a][b]==-1){
34             line[a][b]=1;
35             line[5-a][5-b]=0;
36             dfs(a,b,n);
37             line[a][b]=-1;
38             line[5-a][5-b]=-1;
39         }
40     }
41     return ;
42 }
43 int main ()
44 {
45     memset(line,-1,sizeof(line));
46     sum=0;
47     line[0][0]=1;
48     line[5][5]=0;
49     dfs(0,0,0);
50     int i,j,k,l,num=0;
51     for(i=0;i<sum;i++){
52         int yy=0;
53         for(j=i+1;j<sum;j++){
54             int y=1;
55             for(k=0;k<6;k++){
56                 for(l=0;l<6;l++){
57                     if(vis[i].dis[k][l]!=vis[j].dis[k][l]){
58                         y=0;
59                         break;
60                     }
61                 }
62                 if(y==0)
63                     break;
64             }
65             if(y==1){
66                 yy=1;
67                 break;
68             }
69         }
70         if(yy==0){
71             for(k=0;k<6;k++){
72                 for(l=0;l<6;l++){
73                     printf("%d ",vis[i].dis[k][l]);
74                 }
75                 printf("\n");
76             }
77             system("pause");
78             num++;
79         }
80     }
81     printf("%d %d %d\n",sum,num,num/2);//sum为所有搜到的结果,num是去重之后的结果,因为num里面还没有考虑到左下和右上对称的情况,所以最后结果应对二取商
82     return 0;
83 }

后来在网上看到一个大牛写的解题报告,思路主要就是搜索他的切割线,把他的每种情况的切割线搜出来,虽然方块不是一笔画,但是他的切割线肯定是一个一笔画啊(一刀两快儿

),而且每一种切割线都会经过中间的那个点(肯定啊!!(3,3)和(4,4)肯定不在同一个块儿里面啊~~~所以切割线肯定会经过他们相邻的那个点),切割线应该从中点开始搜索,而且只要搜索到边线(就是已经把方块分成两部分了)就可以结束,从中点开始搜第一步有四个方向,而且任意一个方向反转一下都可以得到另一个方向的所有情况,所以使用边线搜索的结果最后应该除以/4,下面是从网上搜到的代码:出自http://blog.csdn.net/y1196645376/article/details/69718192/

 1 #include <algorithm>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <stdio.h>
 5 #include <string>
 6 #include <vector>
 7 #include <queue>
 8 #include <map>
 9 #include <set>
10 using namespace std;
11 const int N = 6;
12 int ans = 0;
13 int mpt[N+1][N+1];
14 int dir[4][2] = {0,1,1,0,0,-1,-1,0};
15 void dfs(int x,int y)
16 {
17     if(x == 0 || y == 0 || x == N || y == N){
18         int i,j;
19         ans ++;
20         return;
21     }
22     for(int i = 0 ; i < 4 ; i ++)
23     {
24         int tx = x + dir[i][0];
25         int ty = y + dir[i][1];
26         if(mpt[tx][ty])continue;
27         mpt[tx][ty] = 1;
28         mpt[N-tx][N-ty] = 1;
29         dfs(tx,ty);
30         mpt[tx][ty] = 0;
31         mpt[N-tx][N-ty] = 0;
32     }
33 }
34 int main()
35 {
36     mpt[N/2][N/2] = 1;
37     dfs(N/2,N/2);
38     printf("%d\n",ans/4);
39     return 0;
40 }

但是看到这个代码之后呢,感觉还是有点问题,从中点开始搜索,有四个方向,最后结果除以四,但是在每一个方向里面也会有一些对称的啊例如下图啊假设一开始的时候从中心的点往右走,就可以得到这两种一不同的分割线(所以感觉还是有问题的,有待更新吧,也许是我考虑的东西多了吧):

     

时间: 2024-08-27 04:20:16

方格分割 蓝桥杯心得的相关文章

蓝桥杯-方格分割-dfs

标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共有多少种不同的分割方法. 注意:旋转对称的 属于同一种分割法. 请提交该整数,不要填写任何多余的内容或说明文字. 阿西吧,这道题真的是,绝望,本来的思路是分别从左上角和右下角各引出一条线路,按走过的表格数进行计算,忘记了dfs是一头撞到南墙不回头不能有岔路的那种,于是乎按照格子来走是不行了,去网上找了找

第四届蓝桥杯 c/c++真题

第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天.这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日. 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日. 高斯获得博士学位的那天日记上标着:

第七届蓝桥杯C语言C组-(自己懂的题目)

第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球日报和我们地球的城市早报是一样的, 都是一些单独的纸张叠在一起而已.每张纸印有4版. 比如,某张报纸包含的4页是:5,6,11,12, 可以确定它应该是最上边的第2张报纸. 我们在太空中捡到了一张X星球的报纸,4个页码分别是: 1125,1126,1727,1728 请你计算这份报纸一共多少页(也就

2016年蓝桥杯C/C++B组

第一次参加蓝桥杯,也是有很多感触的,时间完全不够写最后一题... 最后一题没做...还有全排序很重要... 1. 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), -. 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. /*答案:171700*/ #include <iostream> #include &l

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

第三届蓝桥杯 c/c++真题

第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多循环的只是,还有模拟,动态规划的只是. 其中做题过程中,也有了一些新的体会.起初做代码填空题的时候我没办法知道自己做的是对还是错,就跑到网上查答案,后来发现,题目已经给出了代码,起始我们可以自己加上头文件,然后把空缺的代码加上进行调试的,这样就可以验证自己补充的代码是否正确了. 此外在进行调试的时候

《拼音字母》 蓝桥杯复试试题

题目描述 [编程题](满分19分) 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: "bj"就可以定位到"北京".怎样在自己的软件中实现这个功能呢?问题的关键在于:对每个汉字必须能计算出它的拼音首字母. GB2312汉字编码方式中,一级汉字的3755个是按照拼音顺序排列的.我们可以利用这个特征,对常用汉字求拼音首字母. GB2312编码方案对每个汉字采用两个字节表示.第一个字节为区号,第二个字节为区中的偏移号.为了能与已有的

猫和老鼠 蓝桥杯/手速/暴力练习赛(暴力搜索)

猫和老鼠 蓝桥杯/手速/暴力练习赛 [题目描述] 猫和老鼠在10*10 的方格中运动,例如: *...*..... ......*... ...*...*.. .......... ...*.C.... *.....*... ...*...... ..M......* ...*.*.... .*.*...... C=猫(CAT) M=老鼠(MOUSE) *=障碍物 .=空地 猫和老鼠每秒中走一格,如果在某一秒末他们在同一格中,我们称他们“相遇”. 注意,“对穿”是不算相遇的.猫和老鼠的移动方式相

算法-蓝桥杯习题(六)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid