剪邮票 dfs

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

现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。


请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

题目答案:

116

题目思路:

枚举五种数的所有组合然后判断这五个数是否连通即可。判断连通性可以用DFS来判断,上下左右四个方向可以将题目中的1,2,3,4,5,6,7,8,9,10数字进行转换,4和5是无法连通的,可以将其变为1,2,3,4,6,7,8,9,11,12,13,14如图,这样我就可以实现左右分别+1和-1,上下分别+5和-5来实现。

#include<stdio.h>
#include<string>
using namespace std;
int temp2[5];
int temp1[12]={1,2,3,4,6,7,8,9,11,12,13,14};
int dict[4]={1,-1,5,-5};
int vis[5];
int ans=0;

void dfs(int n){
    for(int i=0;i<4;i++){
        int j = temp2[n]+dict[i];
        if(j>=1&&j<=14){
            for(int k=0;k<5;k++)
            {
                if(temp2[k]==j&&!vis[k])
                {
                    vis[k]=1;
                    dfs(k);
                }
            }
        }
    }

}

int main(){
    int a,b,c,d,e;
    for(a=0;a<12;a++){
        for(b=a+1;b<12;b++){
            for(c=b+1;c<12;c++){
                for(d=c+1;d<12;d++){
                    for(e=d+1;e<12;e++){
                        temp2[0]=temp1[a];
                        temp2[1]=temp1[b];
                        temp2[2]=temp1[c];
                        temp2[3]=temp1[d];
                        temp2[4]=temp1[e];
                        memset(vis,0,sizeof(vis));
                        vis[0]=1;
                        dfs(0);
                        int flag = 1;
                        for(int i =0;i<5;i++)
                        {
                            if(vis[i]==0){
                                flag=0;
                            }
                        }
                        if(flag)ans++;
                    }
                }
            }
        }
    }
    printf("%d\n",ans);
} 

链接:http://blog.csdn.net/qq_34594236/article/details/61209276

时间: 2024-07-31 14:19:04

剪邮票 dfs的相关文章

java算法 第七届 蓝桥杯B组(题+答案) 7.剪邮票

7.剪邮票  (结果填空) 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的剪取方法. 请填写表示方案数目的整数.注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 思路: 感觉还是先排列,从12个邮票中选5个出来,         然后对每个邮票搜索,同一行,同一列,则表示连接到,如果连接到就定义 

16年第七届蓝桥杯第七题_剪邮票

剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的剪取方法. 请填写表示方案数目的整数.注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. //枚举所有可能的组合,然后判断是否连通 #include<iostream> #include<cstdio> #include<cst

第七届蓝桥杯省赛7:剪邮票

第七届蓝桥杯省赛7:剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的剪取方法. 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 解决思路:先将所有五个一组的情况遍历,然后用广度优先判断是否连通. 我在选五个一组的时候是用的 for 先选出第几个邮票,然后将其

剪邮票

如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的剪取方法.请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字.答案: (19分) 先选择五个数共有792种选法,然后判断五个数是否连通.共116种. 代码: #include <iostream> #include <a

7.剪邮票

如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的剪取方法. 请填写表示方案数目的整数.注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 分析:

蓝桥杯练习系统历届试题 剪格子 dfs

问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|*******--+| 1| 2| 3|+--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目. 如果无法分割,则输出 0. 输入格式 程

2016蓝桥杯C++A组第七题 剪邮票

从1-12中从小到大选取5个数(DFS) BFS判断找出来的5个数是否连通:以任意一个(我的程序取得是最小的)为起点,BFS搜索   是否可以搜索到5个 如果可以 说明是连通的 #include<iostream> #include<stdio.h> #include<cmath> #include<queue> using namespace std; int a[13] = { 0 };//dfs int l[5];//存储已经 找到的5个数 int s

nyoj 邮票分你一半

邮票分你一半 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述      小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分成两份,并且使这两份邮票的分值和相差最小(就是小珂得到的邮票分值和与小明的差值最小),现在每张邮票的分值已经知道了,他们已经分好了,你知道最后他们得到的邮票分值和相差多少吗? 输入 第一行只有一个整数m(m<=1000),表示测试数据组数.接下来有一个整数n(n<=1000),表示邮票的张数.然后有n

第七届蓝桥杯本科B组省赛

煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), -. 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 思路: 推出第i层有i*(i+1)/2个煤球,累加到100层即可,答案为171700 #include <bits/stdc++.h> using namespace std; int main() {