博客
关于我
蓝桥杯 2016年javaB组原题剪邮票 (bfs+暴力迭代)
阅读量:792 次
发布时间:2019-03-25

本文共 2685 字,大约阅读时间需要 8 分钟。

剪邮票问题可视化为图形中寻找五个互相连接的点的问题。该图形由12张邮票组成,呈现3行4列的结构。用户的目标是从中剪取五张连续连接的邮票,仅仅连接一个边不算连续。

问题分析

将邮票排列的二维坐标视为一个3行4列的网格点。每个点的坐标为(i, j),其中i范围[1,3],j范围[1,4]。需要从中选择五个点,使得这五个点彼此连贯(上下左右相邻),无孤立点。

方法思路

针对该问题,可以采用广度优先搜索(BFS)遍历图形。首先,确定起点和终点,然后使用BFS检查是否所有点都被访问到。

  • 图形初始化:创建一个3x4的网格,标记是否访问过。
  • 起点和终点:根据输入点位置,设定起点和终点。
  • BFS遍历:从起点出发,逐层扩展,判断终点是否被访问。
  • 解决代码

    import java.util.Arrays;import java.util.LinkedList;import java.util.Queue;public class L2016剪邮票 {    static boolean vis[][] = new boolean[3][4];    static int mp[][] = new int[3][4];    static int dx[] = { -1, 0, 1, 0 };    static int dy[] = { 0, -1, 0, 1 };    static class d {        int x;        int y;        public d(int x, int y) {            this.x = x;            this.y = y;        }    }    static Queue
    q = new LinkedList<>(); static d end; static void init() { for (int i = 0; i < 3; i++) { Arrays.fill(vis[i], false); Arrays.fill(mp[i], -1); // 障碍 } } static boolean Check(int x, int y) { if (x >= 0 && y >= 0 && x < 3 && y < 4 && mp[x][y] != -1) return true; return false; } static void bfs(int x, int y) { end = new d(x, y); q.add(end); while (!q.isEmpty()) { d now = q.poll(); for (int i = 0; i < 4; i++) { int xx = now.x + dx[i]; int yy = now.y + dy[i]; if (Check(xx, yy) && !vis[xx][yy]) { vis[xx][yy] = true; d next = new d(xx, yy); q.add(next); } } } } public static void main(String[] args) { int ans = 0; for (int i = 0; i < 12; i++) { for (int j = i + 1; j < 12; j++) { for (int k = j + 1; k < 12; k++) { for (int l = k + 1; l < 12; l++) { for (int m = l + 1; m < 12; m++) { init(); mp[i/4][i%4] = 1; mp[j/4][j%4] = 1; mp[k/4][k%4] = 1; mp[l/4][l%4] = 1; mp[m/4][m%4] = 1; vis[i/4][i%4] = true; bfs(i/4, i%4); if (vis[i/4][i%4] && vis[j/4][j%4] && vis[k/4][k%4] && vis[l/4][l%4] && vis[m/4][m%4]) { ans++; } } } } } } System.out.println(ans); }}

    答案

    经过计算,共有116种不同的剪取方法。

    感受

    这道题在于将实际问题转化为图的遍历问题,通过BFS验证连通性。暴力枚举虽然不够优化,但在小规模数据下仍然有效。

    转载地址:http://mjiuk.baihongyu.com/

    你可能感兴趣的文章
    python前端之css
    查看>>
    Python制作进度条,原来有这么多方法
    查看>>
    Python制作简单的学生成绩管理系统
    查看>>
    python制作甘特图的基本知识(附Demo)
    查看>>
    python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
    查看>>
    Python到底能做什么?它的优点在哪?
    查看>>
    python利用pytorch库导出图像分割算子
    查看>>
    python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
    查看>>
    python利用excel分析过杀漏失
    查看>>
    python判断汉字数目
    查看>>
    python判断文件是空的,如果是空的,就删除
    查看>>
    python判断密码是否正确_python密码判断是否符合要求的方法
    查看>>
    python判断字符串包含中文_Python 判断字符串是否包含中文
    查看>>
    python删除第一行_Python 乱码指北:一行删掉根目录
    查看>>
    Python删除列表元素的三种方法
    查看>>
    python初步学习-python数据类型-集合(set)
    查看>>
    python列表生成字典_Python中将字典转换为列表的方法
    查看>>
    python列表对应元素合并为列表及判断一个列表是几维
    查看>>
    python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
    查看>>
    python列表前几个_python之列表
    查看>>