【状态压缩 搜索】SSL_1150 密室

2024-01-30 04:38

本文主要是介绍【状态压缩 搜索】SSL_1150 密室,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意

N N N个房间, M M M个传送门, K K K种钥匙,每个房间有一些钥匙,每个传送门可以从一个房间传到另一个房间,需要一定的钥匙才能使用传送门,求出经过最少的传送门能从 1 1 1号房间到达 N N N号房间。

思路

压缩钥匙的状态,然后 B F S BFS BFS就行了。

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;struct node{int to, k, next;
}e[6001];
struct state{int w, k;
};
int N, M, K, ans, x;
int key[5001], list[5001], d[2048][5001];void bfs() {queue<state> q;q.push((state){1, key[1]});memset(d, -1, sizeof(d));d[key[1]][1] = 0;while (q.size()) {state head = q.front();q.pop();for (int i = list[head.w]; i; i = e[i].next) {int s = head.k, y = e[i].to;if ((s & e[i].k) == e[i].k && d[s | key[y]][y] == -1) {//判断分层q.push((state){y, s | key[y]});d[s | key[y]][y] = d[s][head.w] + 1;}}if (head.w == N) ans = min(ans, d[head.k][N]);}
}int main() {scanf("%d %d %d", &N, &M, &K);for (int i = 1; i <= N; i++) {for (int j = 1; j <= K; j++) {scanf("%d", &x);key[i] = key[i] << 1 | x;}}for (int i = 1; i <= M; i++) {scanf("%d %d", &x, &e[i].to);e[i].next = list[x];list[x] = i;for (int j = 1; j <= K; j++) {scanf("%d", &x);e[i].k = e[i].k << 1 | x;}}ans = 2147483647;bfs();if (ans == 2147483647) printf("No Solution");else printf("%d", ans);
}

这篇关于【状态压缩 搜索】SSL_1150 密室的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动