2016年第七届蓝桥杯【C++省赛B组】【第七题:剪邮票】——并查集

10人阅读 评论(0) 收藏 举报
分类:
标题:剪邮票

如【图1.jpg】, 有12张连在一起的12生肖的邮票。


现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)

比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。



请你计算,一共有多少种不同的剪取方法。

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


看到很多用搜索的,想了想,并查集也能做,相邻也就是连在一起了。

先用一个结构体记录每个格子的编号、坐标、是否被选,然后选出五个格子,计算这五个格子有多少个独立分块,如果只有一个,说明是连着的,属于一种方案。

代码:

#include<bits/stdc++.h>
using namespace std;
int pre[12];
struct youpiap {
  int x, y, flag;
}p[12];
int find(int x) {
  if(x == pre[x]) return x;
  return pre[x] = find(pre[x]);
}
void join(int n) {
  int xx = p[n].x, yy = p[n].y;
  int father = find(n);
  for(int i = 0; i < 12; i++) {
    if(i == n || p[i].flag == 0) continue;
    if((p[i].x==xx&&p[i].y==yy+1) || (p[i].x==xx&&p[i].y==yy-1) || (p[i].x==xx+1&&p[i].y==yy) || (p[i].x==xx-1&&p[i].y==yy)) {
      pre[find(i)] = father;
    } 
  } 
}
int main() {
  int sum = 0;
  for(int i = 0; i < 12; i++) {
    pre[i] = i;
    p[i].flag = 0;
  }
  int kk = 0;
  for(int i = 1; i <= 3; i++)
    for(int j = 1; j <= 4; j++) {
      p[kk].x = i;
      p[kk].y = j;
      kk++;
    }
  for(int i = 0; i < 8; i++) {
    for(int j = i+1; j < 9; j++) {
      for(int k = j+1; k < 10; k++) { 
        for(int q = k+1; q < 11; q++) {
          for(int t = q+1; t < 12; t++) {
            p[i].flag = 1, p[j].flag = 1, p[k].flag = 1, p[q].flag = 1, p[t].flag = 1;
            for(int i = 0; i < 12; i++)
              if(p[i].flag) join(i);
            set<int> s;
            for(int i = 0; i < 12; i++)
              if(p[i].flag) s.insert(find(i));
            if(s.size() == 1) sum++;
            for(int tt = 0; tt < 12; tt++)
              pre[tt] = tt;
            p[i].flag = 0, p[j].flag = 0, p[k].flag = 0, p[q].flag = 0, p[t].flag = 0;
          }   
        }      
      } 
    }  
  }
  cout << sum << endl;
  return 0;
}


查看评论

2016年第七届蓝桥杯C/C++程序设计本科B组省赛 剪邮票(结果填空)

剪邮票 如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连) 比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就...
  • u014552756
  • u014552756
  • 2016-03-21 14:23:24
  • 12529

第七届蓝桥杯b组第七题-剪邮票

剪邮票如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连) 比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分...
  • sb_Ihateyou
  • sb_Ihateyou
  • 2017-03-27 21:40:52
  • 2410

2016年第七届蓝桥杯C/C++程序设计本科B组省赛 剪邮票(结果填空)

剪邮票 如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连) 比如,【图2.jpg】,【图3.jpg】中,粉红色...
  • update7
  • update7
  • 2017-04-04 16:57:36
  • 19725

2016年第七届蓝桥杯省赛(C/C++ A组)

父亲和儿子 枚举 生日蜡烛 枚举 填格子 DFS 快速排序 去掉尾1 四则运算 DFS 剪邮票 DFS 四方定理 枚举 回文串 区间DP 区间DP 最小回文代价经典例题 最大公比...
  • idealism_xxm
  • idealism_xxm
  • 2016-03-20 18:26:24
  • 5194

2016第七届蓝桥杯C/C++B组省赛第七题-剪邮票

剪邮票 如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连) 比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就...
  • Kyrie_w
  • Kyrie_w
  • 2017-03-22 20:03:58
  • 499

2016年第七届蓝桥杯C/C++程序设计本科B组省赛

1.煤球数目 2.生日蜡烛 3.凑算式 4.快速排序 5.抽签 6.方格填数 7.剪邮票 8.四平方和 9.交换瓶子 10.最大比例...
  • u014552756
  • u014552756
  • 2016-03-21 14:41:42
  • 10055

2016年第七届蓝桥杯c/c++省赛B组

2016年第七届蓝桥杯c/c++省赛B组 煤球数目 生日蜡烛 凑算式 快速排序 抽签 方格填数 剪邮票 四平方和 交换瓶子 最大比例...
  • star92014
  • star92014
  • 2016-03-21 09:00:51
  • 9394

2016 蓝桥杯 JavaB组 省赛

2018年4月1日,备战2018蓝桥杯省赛! 转载请注明出处https://blog.csdn.net/yuanlaijike/article/details/69230498 ...
  • yuanlaijike
  • yuanlaijike
  • 2017-04-05 11:58:34
  • 1032

2016第七届蓝桥杯C/C++ B组省赛题解

第七届蓝桥杯C/C++ B组省赛题解
  • y1196645376
  • y1196645376
  • 2016-03-20 22:20:58
  • 71327

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

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 1.煤球数目 有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(...
  • Dodd9199
  • Dodd9199
  • 2016-03-20 15:33:51
  • 4150
    个人资料
    等级:
    访问量: 312
    积分: 96
    排名: 141万+
    文章分类
    文章存档
    最新评论