首页 > 其他分享 >状压+BFS

状压+BFS

时间:2024-01-28 23:11:06浏览次数:23  
标签:int 步骤 状压 long BFS define

洛谷2622

思路
定义一个结构体节点,分别存储状态和步骤,状态的某一位是1表示灯开着,是0则表示该灯关,当状态为0000时输出的步骤即为最小步骤。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define ll long long
 int a[120][102]={0};
 int vis[1<<11]={0};
   int n,m;
 struct node
 {
     int s;
     int step;
 };

 int bfs()
 {
     queue<node>q;
     q.push({(1<<n)-1,0});
     //vis[(1<<n)-1]=1;
     while(q.size())
     {
       auto t=q.front();
       q.pop();

       if(t.s==0)
        return t.step;
       if(vis[t.s])
       {
           continue;
       }
       vis[t.s]=1;
       for(int i=1;i<=m;i++)
       {
            int s=t.s;
         for(int j=1;j<=n;j++)
       {
         if(a[i][j]==1&&s&1<<(j-1))
            s^=1<<(j-1);
         else if(a[i][j]==-1&&!(s&1<<(j-1)))
            s|=1<<(j-1);
       }
       if(!vis[s])
          {
              q.push({s,t.step+1});
          }
     }
     }
     return -1;




 }
void solve()
{

  cin>>n>>m;
  for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
  {
      cin>>a[i][j];

  }
   cout<<bfs();
}
signed main()
{
     cin.tie(NULL);
     cout.tie(nullptr);
     ios_base::sync_with_stdio(false);
        solve();

     return 0;
}

标签:int,步骤,状压,long,BFS,define
From: https://www.cnblogs.com/wner/p/17993600

相关文章

  • leetcode--98. 验证二叉搜索树(bfs)
    记录13:502024-1-28https://leetcode.cn/problems/validate-binary-search-tree/想岔方向了,想的太复杂了。首先思路是每个root节点必须大于左子树的最大节点,小于右边子树的最小节点。我的做法是记录下叶子节点,因为左边叶子节点的集合(vector)的最后一个节点为左子树的最大值......
  • POJ2627 数独 (dfs or bfs)
    POJ2627数独(dfsorbfs)给出一个数独,空白用0表示,输出一个合理答案即可;SampleInput1103000509002109400000704000300502006060000050700803004000401000009205800804000107SampleOutput1436285795721394689867542313915427864689173527258639142374816956......
  • 搜索学习笔记+杂题 (进阶二 dfs/bfs的进阶)
    前言:由于搜索的题还是做的太少了,所以以后有可能会不定期更新。四、还是进阶的dfs/bfs相关题单:戳我1、dfs(1)meetinthemiddleP2962[USACO09NOV]LightsG颠覆了我对折半搜索的认知,果然,只要满足了折半搜索的几个性质,基本上都可以使用折半搜索来处理。首先我们拿到的是一张......
  • 搜索学习笔记+杂题 (进阶一 dfs/bfs的进阶)
    前言:没啥好说的了。所以只能来写博客了。搜索杂题:相关题单:戳我二、进阶dfs/bfs1、dfs进阶——折半搜索(meetinthemiddle)由于深搜的时间复杂度在每种状态有两个分支的情况下是\(O(2^n)\)。所以一般暴力深搜的数据范围就在\(20-25\)之间。而对于有一大类的题,它的搜索思......
  • 搜索学习笔记+杂题 (基础二 dfs/bfs的拓展)
    搜索杂题:博客中讲述的题的题单:戳我二、dfs/bfs的各种变式1、深搜深搜以指数级的时间复杂度闻名,稍不注意时间就会爆炸,所以一般会用到剪枝的技巧(这个技巧基本上是因题而异,需要平时的刷题与积累)。深搜同样也是一种可变性极高的算法(其实都可以不叫做一种算法,深搜已经是一种做题的......
  • BFS-走迷宫
    1.题目简单概述:走迷宫问题,行走的方向是上下左右。这个迷宫内有些格子不能走,想要从迷宫的左上角走到右下角,最少移动次数。这道题属于最短路问题(求出到达一个点的最短路径)。思路分析为什么使用BFS求到的答案能保证是最短的路径?因为BFS是逐层搜索的,能把当前层的所有可能值包......
  • 图(树)的广度优先遍历bfs
    图的广度优先遍历广度优先遍历,就是在遍历时优先考虑遍历的广度,不像深度优先那样一条路径遍历到底,而是一层一层的遍历。由于广度优先是一层一层节点的遍历,在图的边权值都为1的情况下,若我们要求出节点a到节点b的最短路,就可以以a为源点(source)进行广搜,当a第一次搜到b时,其路径一......
  • 状压dp
    状压dp暴力枚举每一天摸不摸鱼,对于每一组方案,我们都可以判断其可不可行,从可行方案中选择快乐值总和最大的一组;复杂度\(O(2^{20})\)每一组方案可以用一个长度为n的二进制串来表示;从右到左第i个位置表示第i天摸不摸鱼(1表示,0表示不摸)当n=5时,10111表示在1,2,......
  • BFS模板
    #classSolution:#defBFS(self,start,target):#q=[]#用一个列表做队列#v=[]#记录走过的路#q.append(start)#把起点放入队列#v.append(start)#加入走过的路#step=0#记录扩散步数#while......
  • class080 状压dp-上【算法】
    class080状压dp-上【算法】算法讲解080【必备】状压dp-上Code1464.我能赢吗//我能赢吗//给定两个整数n和m//两个玩家可以轮流从公共整数池中抽取从1到n的整数(不放回)//抽取的整数会累加起来(两个玩家都算)//谁在自己的回合让累加和>=m,谁获胜//若先出手的玩家能稳赢则......