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 sum = 0;
typedef struct node{
    int x, y;
    struct node(){
        x = -1;
        y = -1;
    }
    struct node(int xx, int yy){
        x = xx;
        y = yy;
    }
}Node;
bool ok(){//bfs判断找到的5个数是否连通
    int arr[3][4];//存储剪切矩阵
    int flag[3][4];
    for (int i = 0; i<3; i++){
        for (int j = 0; j<4; j++){
            arr[i][j] = 0;//bfs过程中标记是否可访问
            flag[i][j] = 0;//bfs过程中标记是否已经访问
        }
    }
    for (int i = 0; i<5; i++){
        arr[(l[i]-1)/4][(l[i]-1)%4]= 1;
    }
    /*cout << "arr:" << endl;
    for (int i = 0; i<3; i++){
        for (int j = 0; j<4; j++){
            cout << arr[i][j];
            cout << " ";
        }
        cout << endl;
    }*/
    int dir[4][2]{//上下左右方向控制
        { -1, 0},
        { 1, 0 },
        { 0, -1 },
        { 0, 1 }
    };
    queue<Node> q;
    Node vs((l[0] - 1) / 4, (l[0] - 1) % 4);
    flag[vs.x][vs.y] = 1;
    q.push(vs);
    int ssum = 1;
    Node vn, vw;
    while (q.empty() == false){
        vn = q.front();
        q.pop();
        for (int i = 0; i<4; i++){
            vw.x = vn.x + dir[i][0];
            vw.y = vn.y + dir[i][1];
            //cout << vw.x << vw.y << endl;
            /*cout << "flag:" << endl;
            for (int i = 0; i<3; i++){
                for (int j = 0; j<4; j++){
                    cout << flag[i][j];
                    cout << " ";
                }
                cout << endl;
            }*/
            //getchar();
            if (vw.x >= 0 && vw.x <= 2 && vw.y >= 0 && vw.y <= 3){
                if (flag[vw.x][vw.y] == 0 && arr[vw.x][vw.y] == 1){//如果改点未访问过   且该点可访问
                    flag[vw.x][vw.y] = 1;//标记该节点已经访问过
                    q.push(vw);
                    ssum++;
                }
            }
        }
    }
    //cout << ssum << endl;
    if (ssum == 5) return true;
    return false;

}
void dfs(int x){
    if (x>1 && (l[x - 1]<l[x - 2])) return;//递减就不要
    if (x == 5&&ok()){
        /*for (int i = 0; i<5; i++){
            printf(" %d", l[i]);
        }
        printf("\n");*/
        sum = sum + 1;
        //printf("打印%d\n",sum);
        return;
    }
    if (x == 5) return;
    for (int i = 1; i<13; i++){
        if (a[i] == 0){
            l[x] = i;
            a[i] = 1;
            dfs(x + 1);
            a[i] = 0;
        }
    }
}
int main(){
    dfs(0);
    cout << sum << endl;
}

时间: 2024-10-11 03:20:34

2016蓝桥杯C++A组第七题 剪邮票的相关文章

2016蓝桥杯C++A组第八题 四平方和

直接暴力的话  四层循环 很可能超时  这里用到了小技巧 #include<stdio.h> #include<iostream> #include<cmath> using namespace std; int a[5000001]; int main(){ int n; cin>>n; int flag=0; for(int i=0;i<=(int)sqrt(n);i++){ for(int j=i;j<=(int)sqrt(n);j++){

第七届(16年)蓝桥杯java B组决赛真题

1.愤怒小鸟(填空)X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车间相距 1000 米两火车 (不妨称A和B) 以时速 10米/秒 相对行驶. 愤怒的小鸟从A车出发,时速50米/秒,撞向B车,然后返回去撞A车,再返回去撞B车,如此往复....两火车在相距1米处停车. 问:这期间愤怒的小鸟撞 B 车多少次? 注意:需要提交的是一个整数(表示撞B车的次数),不要填写任何其它内容. 1 public class One { 2 //A.B的位置a.b的大小相对于A的起点而言,小鸟的速度为50,A

第四届(13年)蓝桥杯java B组决赛真题

1.标题:猜灯谜(填空) A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜        小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字.        请你用计算机按小明的思路算一下,然后提交"请猜谜"三个字所代表的整数即可. 请严格按照格式,通过浏览器提交答案.    注意:只提交一个3位的整数,不要写其它附加内容,比如:说明性的文字. 1 import java.util.Scanner; 2 //猜灯谜 3 public class Main{

第六届蓝桥杯java b组第8题

乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能得到多少瓶饮料. 输入 一个整数n,表示开始购买的饮料数量(0 < n < 10000) 输出 一个整数,表示实际得到的饮料数 例如: 用户输入 100 程序输出 149 用户输入 101 程序输出 151 资源约定 峰值内存消耗(含虚拟机) < 256M CPU消耗 &l

2015年蓝桥杯java b组第十题

10. 生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 {a, v1, v2, -, vk, b} 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连. 在这个前提下,上帝要使得S中的点所对应的整数的和尽量大. 这个最大的和就是上帝给生命之树的评分. 经过atm的努力,他已经知道了上帝给每棵树上每个节点上的整数

01_蚂蚁感冒(第五届蓝桥预赛本科B组第8题 nyoj 990)

问题来源:第五届蓝桥预赛本科B组第8题 问题描述:有在一条定长(100cm)的直杆上有n(1<n<50)只蚂蚁(每只蚂蚁的起点都不一样),他们都以相同的速度(1cm/s)向左或者向右爬, 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂蚁感冒了.并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁. 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒. 问题分析:1.两只蚂蚁碰面时,往相反方向爬行,等价于两只蚂蚁相遇后继续爬行(只不过换了蚂蚁). 2.如果感冒蚂蚁(s

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

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

第六届蓝桥杯本科B组C++省赛题解

比赛结束已经一星期了,成绩也出来了,江苏非211组的省前十,但是深感自己还是有太多的不足.绝对不能以自己还只是大一为借口,acm这条路还长的很. 目测得了95分(满分150),第一题错了,代码填空第一题错了,倒数第二题扣了一点分,最后一道大题全错. 之所以会这么晚来发这道题解,是因为深感自己不足,倒数第二题之所以没有做出来,是因为自己居然不会用[矩阵快速幂].因此,现学现用以自省. 关于题目:所有填空题都可以纯暴力,只要会回溯剪枝法对于蓝桥杯已经足够了.大题目难度一年比一年高 第一题 结果填空

算法笔记_213:第七届蓝桥杯软件类决赛部分真题(Java语言C组)

目录 1 平方末尾 2 七星填数 3 打印数字 4 赢球票 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 平方末尾 平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, 4, 5, 6, 9] 这6个数字中的某个. 所以,4325435332必然不是平方数. 如果给你一个2位或2位以上的数字,你能根据末位的两位来断定它不是平方数吗? 请计算一下,一个2位以上