-sky- 2017-03-29 14:01 采纳率: 0%
浏览 978

好奇怪一个BUG 各路大神求解 谢谢谢谢!!!

题目是这样的:
剪邮票

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

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

请填写表示方案数目的整数。
图片说明

嗯 !!蓝桥杯2016年B组第七题

读代码之前请各位大神谅解,不要吐槽我的算法,我刚学这个半年;

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <cstring>

using namespace std;

int MP[3][4];
int A[6], B[6];   //A暂时存选出来的五个数      B保存这个数是不是选过
int sum;
int dx[] = {0,0,1,-1}, dy[] = {1,-1,0,0};
int cut;
struct nod
{
    int x, y;
} nd;

queue<nod> qq;

void bfs(int x, int y)      //搜索五个块是不是连着的
{
    while(!qq.empty()) qq.pop();

    nd.x = x;
    nd.y = y;
    qq.push(nd);
    int m=0;
    while(!qq.empty())
    {
        nd = qq.front();
        for(int i=0; i<4; i++)
        {
            nd = qq.front();
            int xx = nd.x+dx[i];
            int yy = nd.y+dy[i];
            if(xx>=0&&yy>=0&&xx<3&&yy<4&&MP[xx][yy]==1)
            {
                m++;
                MP[xx][yy] = 0;
                nd.x = xx;
                nd.y = yy;
                qq.push(nd);
            }
        }
        qq.pop();
    }

    if(m==5) sum++;       //如果五个数连着  代表符合要求  sum+1

}


void solve(int cur)             //选出五个没有顺序的数       保证  12345   和 54321 是一种情况 只出现一次
{
    if(cur==5)
    {
        for(int i=0; i<5; i++) printf("%d  ", A[i]);   //调试时输出的每次选出的五个数
        cout << endl;
        memset(MP, 0, sizeof(MP));
        for(int i=0; i<5; i++)
        {
            MP[ A[i]/4 ][ A[i]%4 ] = 1;
        }
        bfs(A[0]/4,A[0]%4);
        return;
    }
    for(int i=0; i<12; i++)
    {
        if(cur==0)
        {
            if(!B[i])
            {
                B[i] = 1;
                A[cur] = i;
                solve(cur+1);
                B[i] = 0;
            }
        }
        else
        {
            if(!B[i]&&i>A[cur-1])
            {
                B[i] = 1;
                A[cur] = i;
                solve(cur+1);
                B[i] = 0;
            }
        }
    }
}

int main()
{
//   memset(B,0,sizeof(B));
    solve(0);
    cout << sum <<endl;
    return 0;
}


我调试时打印了所有的情况 (那五个数)

嗯 他是错的的·····
图片说明
他并不是连续的 跳过了几个数

当我把 41, 42 行的代码注释掉的时候

 void bfs(int x, int y)      //搜索五个块是不是连着的
{
    while(!qq.empty()) qq.pop();

    nd.x = x;
    nd.y = y;
    qq.push(nd);
    int m=0;
    while(!qq.empty())
    {
        nd = qq.front();
        for(int i=0; i<4; i++)
        {
            nd = qq.front();
            int xx = nd.x+dx[i];
            int yy = nd.y+dy[i];
            if(xx>=0&&yy>=0&&xx<3&&yy<4&&MP[xx][yy]==1)
            {
                m++;
                MP[xx][yy] = 0;
//                nd.x = xx;   //这两行 
//                nd.y = yy;
                qq.push(nd);
            }
        }
        qq.pop();
    }

    if(m==5) sum++;       //如果五个数连着  代表符合要求  sum+1

}

图片说明
嗯 他又对了······

而且注释的代码跟下面那个回溯貌似没有关系·······

哪位大神给指点迷津 困惑好久了 感谢感谢!!!!

  • 写回答

3条回答 默认 最新

  • threenewbee 2017-03-29 15:07
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划