题目提交

code

1. dfs暴力搜索

深搜所有状态,填X时要判断是否可行,没啥可说,暴力就完了,不过居然能过,规模确实小。

import java.util.Scanner;//暴搜居然过
public class 矩阵计数_dfs暴搜 {static int[][] map;static int n;static int m;static int ans;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();sc.close();//long a=System.currentTimeMillis();map = new int[n][m];dfs(0,0);System.out.println(ans);//System.out.println(System.currentTimeMillis()-a);}static void dfs(int x, int y) {if (x == n) {ans++;return;}if ((x < 2 || map[x - 1][y] == 0 || map[x - 2][y] == 0)&& (y < 2 || map[x][y - 1] == 0 || map[x][y - 2] == 0)) {//判断是否可以为Xmap[x][y] = 1;if (y < m - 1)dfs(x, y + 1);elsedfs(x + 1, 0);map[x][y] = 0;}if (y < m - 1)dfs(x, y + 1);elsedfs(x + 1, 0);}
}

2. dfs+二进制枚举

用二进制来表示每一行的所有状态,省时省力。
不懂请搜:二进制枚举

import java.util.Scanner;public class 矩阵计数_dfs_二进制枚举 {static int[] map;static boolean[] vis;static int n;static int m;static int max;static int ans;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();sc.close();//long a = System.currentTimeMillis();map = new int[n];max = 1 << m;vis = new boolean[max];for (int i = 0; i < max; i++) {vis[i] = check(i);}dfs(0);System.out.println(ans);//System.out.println(System.currentTimeMillis() - a);}static void dfs(int x) {if (x == n) {ans++;return;}for (int i = 0; i < max; i++) {if (!vis[i]&&(x < 2 || (map[x - 1] & map[x - 2] & i) == 0)) {map[x] = i;dfs(x + 1);}}}//判断是否有三个1连续static boolean check(int x) {int ans = 0;while (x > 0) {if ((x & 1) == 1)ans++;elseans = 0;if (ans == 3)return true;x >>= 1;}return false;}
}

3. 状态压缩动态规划(状压dp)

同样用到了二进制
参考(python)
dp[i][j][k],表示第i行状态为j,上一行状态为k时,符合条件的方案数。
初始化:dp[0][i][0] = 1;j为每个符合条件的二进制状态。
转换方程:

for (int i = 1; i < n; i++)for (int j : list)for (int k :list)for (int p : list)if ((j & k & p) == 0)//判断有无连续三个1dp[i][j][k] += dp[i - 1][k][p];
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class 矩阵计数_动态规划 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();sc.close();//long a = System.currentTimeMillis();List<Integer> list = new ArrayList<>();int state=1<<m;for (int i = 0; i < state; i++) {//筛选符合条件状态if (!check(i))list.add(i);}int[][][] dp = new int[n][state][state];//初始化for (int i : list)dp[0][i][0] = 1;for (int i = 1; i < n; i++)for (int j : list)for (int k :list)for (int p : list)if ((j & k & p) == 0)//判断有无连续三个1dp[i][j][k] += dp[i - 1][k][p];//统计int ans = 0;for (int i : list)for (int j : list)ans += dp[n - 1][i][j];System.out.println(ans);//System.out.println(System.currentTimeMillis() - a);}static boolean check(int x) {int ans = 0;while (x > 0) {if ((x & 1) == 1)ans++;elseans = 0;if (ans == 3)return true;x >>= 1;}return false;}
}

4. 三者对比

以6x6矩阵对比:

第三行为耗时,单位毫秒。
动态规划一骑绝尘,不过赛场上的话还是暴力直接过吧,时间有限。

蓝桥杯国赛-矩阵计数三种解法-java实现相关推荐

  1. 49-2017年第八届蓝桥杯国赛试题及详解(Java本科B组)

    蓝桥杯历年真题题目及题解目录汇总(推荐) 蓝桥杯算法模板常用套路及API等个人总结 ---------------------------------------------------------- ...

  2. 2013年第四届蓝桥杯国赛试题及详解(Java本科B组)

    蓝桥杯历年真题题目及题解目录汇总 结果填空 (满分10分) 结果填空 (满分12分) 代码填空 (满分8分) 程序设计(满分17分) 程序设计(满分22分) 程序设计(满分31分) 1.标题:猜灯谜 ...

  3. 2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解

    2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解 更新:成绩出来了,估分50分左右,最后拿了个国二,还差点到国一,有点出乎意料,挺满意了挺满意了. 去年国赛基本都是暴力,最后国三都没拿到(我是 ...

  4. 蓝桥杯国赛五一训练赛(1)

    蓝桥杯国赛五一训练赛(1)(链接) 问题 A: 费解的开关 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变 ...

  5. 蓝桥杯国赛 C/C++ ABC组题解(第四届 ~ 第十二届)

    2020年第十一届蓝桥杯国赛 题号 类型 C++ A组 C++ B组 C++ C组 试题A 结果填空 合数个数 美丽的 2 美丽的 2 试题B 结果填空 含 2 天数 (日期处理) 扩散 (BFS) ...

  6. 蓝桥杯国赛知识点汇总

    蓝桥杯国赛备赛总结知识点,以老师给的为原型,添加自己理解,供大家参考,后期不定时更新. 基础 1.熟练掌握API1.8常用方法 2.大数(高精度)加减乘除 3.并查集 模板: public class ...

  7. 第十二届蓝桥杯国赛真题+题解 Python

    文章目录 写在前面 试题A:带宽 试题 B: 纯质数 试题C: 完全日期 试题D: 最小权值 试题 E: 大写 试题 F: 123 试题 G: 冰山 试题 H: 和与乘积 试题 I: 二进制问题 试题 ...

  8. 蓝桥杯国赛C++A组B组题解整理(第八、七、六、五、四届)

    [写在前面的话19.04.04] 今年省赛的结果出的意外得快,有很多小伙伴来和我分享他们进了省一的喜悦,并问我啥时候更新国赛题解,emmm--不是我不想更新,实在是抽不出时间,有缘再更--虽然不更新题 ...

  9. 太空大战-第14届蓝桥杯国赛Scratch真题中级组第6题

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第148讲. 太空大战,本题是2023年5月28日上午 ...

最新文章

  1. laravel(二):laravel基本入门 看到Hello Laravel
  2. 前端(二)之 CSS
  3. Building Fire Stations 39届亚洲赛牡丹江站B题
  4. Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)
  5. 没有新芯片,没有“大核弹”,黄教主这次给大家带来了个PRADA
  6. java中常忽视的小问题
  7. rwg52_h头文件注释
  8. LINUX编译alsa
  9. linux环境搭建redis集群,Linux下搭建Redis分布式集群(详细图解演示)
  10. java 打印心_在Java中打印输出心形图案!
  11. python公式计算_Python Numpy计算各类距离的方法
  12. 旧电脑改路由器加文件服务器,如何将旧电脑改成软路由器 以winxp系统为例
  13. 南华大学计算机系宿舍,2021年南华大学新生宿舍条件和宿舍环境图片
  14. IMX6ULL - 移植uboot-imx_v2020.04_5.4.70_2.3.0
  15. ubuntu小技巧6--如何修复Ubuntu系统引导项
  16. 经验分布函数无偏性的证明和方差的推导
  17. 如何合并svn分支到主干上
  18. 全球与中国触摸屏IC市场现状及未来发展趋势
  19. ChatGPT:微软人工智能Office和电邮即将登场...
  20. matlab和ccd相机通讯,串口通讯在CCD相机系统中的应用

热门文章

  1. 飞行时间(TOF)相机优缺点及其应用领域
  2. Python-ORM实战
  3. vue 数据绑定实现的核心 Object.defineProperty()
  4. Python函数及其参数
  5. HTML5调用本地摄像头画面,拍照,上传服务器
  6. Sqlite3的安装Windows
  7. iOS 多线程的四种技术方案
  8. 使用 Docker 搭建 Laravel 本地环境
  9. 关于commonjs,AMD,CMD之间的异同
  10. 如何在公司局域网内访问不同网段的主机