前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第七届蓝桥B组java省赛剪邮票

第七届蓝桥B组java省赛剪邮票

作者头像
砖业洋__
发布2023-05-06 17:00:40
730
发布2023-05-06 17:00:40
举报
文章被收录于专栏:博客迁移同步

如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连) 比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。 请你计算,一共有多少种不同的剪取方法。 请填写表示方案数目的整数。

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

不能边标记边判断,比如   2 3 4 5 6的情况,如果边标记边判断,确定了2 3 4之后,确定5,发现5不与其他的相邻,就不会继续往下走到6了。

但是仅仅深搜一边确定周围相邻也是不行的,比如

这样判断周围都是相邻的,但是图并不连通

所以还是要确定之后再判断一次图是否连通

上代码,借鉴的一位博主的想法

代码语言:javascript
复制
public class test {
    public static int count, t;
    public static int[][] book = new int[6][6];
    public static int[] num = new int[5];
    public static int[] x = new int[] { 1, 0, -1, 0 };
    public static int[] y = new int[] { 0, 1, 0, -1 };

    public static void dfs1(int sx, int sy) {
        for (int i = 0; i < 4; ++i) {
            int ex = sx + x[i];
            int ey = sy + y[i];
            if (ex < 1 || ex > 3 || ey < 1 || ey > 4)
                continue;
            if (book[ex][ey] == 1) {
                ++t;
                book[ex][ey] = 0;
                dfs1(ex, ey);
            }
        }
    }

    public static void dfs(int i, int j) {
        if (i == 5) {
            for (int ii = 0; ii < 6; ++ii) {
                for (int jj = 0; jj < 6; ++jj) {
                    book[ii][jj] = 0; // 避免上一步的残留
                }
            }
            int sx = 0, sy = 0;
            for (int k = 0; k < 5; ++k) {
                sy = num[k] % 4;
                if (sy == 0) {
                    sy = 4;
                    sx = num[k] / 4;
                } else {
                    sx = num[k] / 4 + 1;
                }
                book[sx][sy] = 1;
            }
            t = 1;
            book[sx][sy] = 0; // 从最后一个点查找,算第一步了
            dfs1(sx, sy); // 5个点是否连通,走迷宫
            if (t == 5) {
               ++count;
               t = 0;
            }
        } else {
            for (; j < 13; ++j) {
                num[i] = j;
                dfs(i + 1, j + 1);
            }
        }
    }

    public static void main(String[] args) {
        dfs(0, 1);
        System.out.println(count);
    }
}

最后答案是116种

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档