poj2965_refrigerator(BFS+枚举)

2024-06-17 14:58

本文主要是介绍poj2965_refrigerator(BFS+枚举),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结题思想:
1.此题一定要使用枚举,将每一个位置的值变化的可能都枚举一下。但是个要么变,要么不变,并且和改变的顺序无关。(具体的证明我还不是很清楚,希望看到博客的朋友,如果知道怎么证明,请不吝赐教)。
2.要找最少的情况,则一定是要使用广度优先遍历各种情况。
介绍代码中的几个变量:
q[i] 做队列使用,用于存储矩阵的不同状态。
f[i] 此数组和q配合起来,用来记录对应位置状态的是由谁变化而来的。
b[i] 记录次状态是由那个状态变化那个位置的数据而来的。

#include<stdio.h>
#include<stdlib.h>
bool mat[4][4];
int q[90000],f[90000],b[90000];
void printMat(int m)
{int mat1[16];for(int i=15;i>=0;i--){mat1[i]=m%2;m=m/2;}for(int i=0;i<16;i++){printf("%d ",mat1[i]);if((i+1)%4==0) putchar(10);}
}
int main()
{int r=-1,h=0,k=-1;q[h]=0;for(int i=0;i<4;i++){for(int j=0;j<4;j++){char c;scanf("%c",&c);if(c=='+')mat[i][j]=false;        else mat[i][j]=true;q[h]=(q[h]<<1)+mat[i][j]; }getchar();}h++;f[0]=-1;b[0]=0;while(r<h){r++;if(q[r]==65535){k=r;break;                 }if(h>=90000) continue;for(int i=b[r]+1;i<=16;i++){b[h]=i;f[h]=r;q[h]=q[r];q[h]^=1<<(16-i);int l = (i-1)%4;int r = (i-1)/4;for(int j=0;j<4;j++){int x = j+r*4+1;  //行 int y = j*4+l+1;q[h]^=1<<(16-x);q[h]^=1<<(16-y);}h++;}}if(k>=0){int step[20];int w=0;while(f[k]!=-1){step[w]=b[k];k=f[k];w++;}printf("%d\n",w);while(w--){int r = (step[w]-1)/4+1;int l = (step[w]-1)%4+1;printf("%d %d\n",r,l);}}system("pause");return 0;  
}

这篇关于poj2965_refrigerator(BFS+枚举)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069764

相关文章

多源 BFS

例题一 解法(bfs)(多个源头的最短路问题) 算法思路: 对于求的最终结果,我们有两种⽅式: • 第⼀种⽅式:从每⼀个 1 开始,然后通过层序遍历找到离它最近的 0 。 这⼀种⽅式,我们会以所有的 1 起点,来⼀次层序遍历,势必会遍历到很多重复的点。并且如果 矩阵中只有⼀个 0 的话,每⼀次层序遍历都要遍历很多层,时间复

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统,而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备,并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线的 子设备。 标识和报告子设备的过程称为 总线枚举。 在总线枚举期间,总线驱动程序会为其子 设备创建设备对象 。  总线驱动程序本质上是同时处理总线枚

BFS:解决多源最短路问题

文章目录 什么是多源最短路问题?1.矩阵2.飞地的数量3.地图的最高点4.地图分析总结 什么是多源最短路问题? 多源最短路问题(Multi-Source Shortest Path Problem,MSSP)是图论中的一个经典问题,它的目标是在给定图中找到从多个源点到所有其他顶点的最短路径。这个问题可以视为单源最短路问题(Single-Source Shortest Pa

IOS Swift 从入门到精通:数组,集合,元组,对比,字典,枚举

目录 数组 集合 元组 Arrays vs sets vs tuples 字典  字典默认值 创建空集合 枚举 枚举关联值 枚举原始值 复杂类型:总结 数组 数组是存储为单个值的值的集合。例如,John、Paul、George 和 Ringo 是姓名,但数组可让您将它们分组为单个值,即 The Beatles。 在代码中我们这样写: let john

java基础知识枚举提取公共类

引用地址:今日头条 如何规范化Enum在项目中的使用? 2022-03-02 14:14·老顾聊技术 前言 在我们平时开发过程中,枚举的使用时必不可少的。 为什么要用枚举? 有穷序列的字段用int或tinyint不是挺好吗? 答案很简单:我们的程序写给人看的。 既然是写给人看,那么,可理解、易理解往往显得相当重要! 枚举一般有两部分,一个是枚举项值,一个是枚举描述。那么,这两个

博弈论+递推+调和级数枚举,CF 1033C - Permutation Game

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1033C - Permutation Game 二、解题报告 1、思路分析 我们考虑一个位置符合什么条件可以必胜? 如果可以跳到一个必败的位置 考虑最大的格子一定是必败 而每个格子只能跳到比自己大的格子 于是我们就可以倒序处理状态 对于每个格子枚举比自己大

Android性能优化—不建议使用枚举Enum

最近优化App,由于项目中使用了Lib,而Lib代码中包含了大量的枚举类型,导致App占用内存过多发火。好吧,知道问题点,那就干掉,抛弃之~偷笑 问题是解决了,为啥会这样呢?疑问 先来看看Android官网的说明吧: 看见了吧,Android官网不建议咱们使用enums,说的也很清楚了,占用内存多(Enums often require more than twice as much memo

[AIGC] 宽度优先搜索(BFS) 讲解以及在 LeetCode 题中的应用

宽度优先搜索(Breadth-First Search,简称 BFS)是一种用于图或树结构的遍历算法。它以广度方向进行搜索,首先访问根节点,然后访问所有相邻的节点,然后再通过它们的邻居一直进行下去,直到所有的节点都被访问过。 文章目录 BFS 的工作过程BFS 在 LeetCode 中的应用 BFS 的工作过程 BFS 从图的某一节点(称为“源”节点)开始,访问可能

BFS 解决最短路问题

例题一 解法(bfs 求最短路): 算法思路: 利⽤层序遍历来解决迷宫问题,是最经典的做法。我们可以从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数。这样就能在找到出⼝的时候,得到起点到出⼝的最短距离。 例题二 解法: 算法思路: 如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为

BFS【2】迷宫

目录 迷宫 走到右下角最短路径长度 走到右下角最短路径 跨步迷宫   迷宫 走到右下角最短路径长度 我是和上一篇一样,创建一个队列,不过while 里面判责是queue非空,否则会死循环万一是死路的话。 也是要判断不要重复入队。 #include <iostream>#include <vector>#include <cmath>#include <string>