hdu 2209 bfs+状压

http://acm.hdu.edu.cn/showproblem.php?pid=2209

不知为啥有种直觉,会出状压+搜索的题,刷几道先

简单的BFS,状压表示牌的状态,

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;

#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const double pi = acos(-1.0);
const int INF = 100000000;

int len,s;
int vis[1<<21];
char in[50];
int legal[25];
struct Node{
    int s;
    int cnt;
    Node(int ss,int cc):s(ss),cnt(cc){}
};

void change()
{
    s=0;
    len=strlen(in);
    for(int i=0;i<len;i++)
    {
        s<<=1;
        if(in[i] == '1')s+=1;
    }
}

int bfs()
{
    queue<Node>q;
    q.push(Node(s,0));
    CL(vis,0);
    vis[s]=1;
    while(!q.empty())
    {
        Node tp=q.front();q.pop();///
        if(tp.s==0)return tp.cnt;
        int s,cnt=tp.cnt+1;
        for(int i=0;i<len;i++)
        {
            if(i==0)s=tp.s^3;
            else
            {
                if(i==len-1)s=tp.s^(3<<(len-2));//
                else s=(tp.s^(7<<(i-1)));
            }
            if(!vis[s])
            {
                vis[s]=1;
                q.push(Node(s,cnt));
            }

        }

    }
    return -1;
}

int main()
{
    //IN("hdu2209.txt");
    while(~scanf("%s",in))
    {
        change();
        int ans=bfs();
        if(ans==-1)puts("NO");
        else printf("%d\n",bfs());
    }
    return 0;
}
时间: 2024-11-08 11:51:26

hdu 2209 bfs+状压的相关文章

HDU 5025 BFS+状压

2014 ACM/ICPC Asia Regional Guangzhou Online N*N矩阵 M个钥匙 K起点,T终点,S点需多花费1点且只需要一次,1-9表示9把钥匙,只有当前有I号钥匙才能拿I+1号钥匙,可以不拿钥匙只从上面走过 4维数组判重,第三维表示钥匙已经拿到第几把,第四维表示已经走过的S的状况,用状压存储 #include "stdio.h" #include "string.h" #include "queue" using

hdu 1429 bfs+状压

题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开始 Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置.Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一 个.魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去.经过若干次的尝试,Ignatius已画出整个地牢的地图.现在请你帮 他计算能否再次成功逃亡.只要在魔王下次视察之前走到出口就算离开地牢

HDU 5040 BFS+状压

2014 ACM/ICPC Asia Regional Beijing Online 对于N*N的矩阵 M起点,T终点 有起始方向分别向北N,东E,南S,西W的摄像头,可以检测的范围为自己+所指方向1格,每1秒顺时针旋转90° 前面有灯或者自己站的地方有灯,移动需要花3秒,或者原地等一秒. BFS优先队列 开3维 hash数组判重,第三维是在该点等待的时间,开到4即可(摄像头转一圈) 对图中的每个点提前处理处会在什么时候被摄像头看到,用2进制压缩存储在MAP数组中 然后常规BFS解决 比赛时候手

HDU 3681 BFS&amp;状压DP&amp;二分

N*M矩阵,从F点出发,走完所有的Y点,每走一格花费1点电量,走到G点时,电量充满,D不可到达,问起始时的最小满电量可以走完所有Y,Y和G一共最多15个 先BFS出所有的F,Y,G之间的最短距离. 然后二分起始电量,对每个电量,做状压DP判断是否可行 #include "stdio.h" #include "string.h" #include "queue" using namespace std; int inf=0x3f3f3f3f; in

HDU 4771 BFS + 状压

Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1343    Accepted Submission(s): 642 Problem Description Harry Potter has some precious. For example, his invisib

HDU 4771 BFS&amp;状压 水

n*m矩阵,起点@,从矩阵中拿k个物品的最小代价 水BFS #include "stdio.h" #include "string.h" #include "queue" using namespace std; int b[]={1,2,4,8,16}; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; struct node { int x,y,step,status; }; int n,m,aim,s_x

hdu 1044(bfs+状压)

非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4684    Accepted Submission(s): 983 Problem Description It is written in the Book of The Lady: Afte

hdu 4568 bfs + 状压dp

//这题的数据是不是有问题... 不考虑宝藏一个也拿不到也能AC... 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int INF = 0x3f3f3f3f; 4 int T; 5 int N, M; 6 int mat[210][210]; 7 int K; 8 int tot_tra, tra[210][210]; 9 10 //dp parameters 11 int dis_tra_broder[20],

hdu 4771 Stealing Harry Potter&#39;s Precious (BFS+状压)

题意: n*m的迷宫,有一些格能走(“.”),有一些格不能走(“#”).起始点为“@”. 有K个物体.(K<=4),每个物体都是放在“.”上. 问最少花多少步可以取完所有物体. 思路: BFS+状压,看代码. 代码: struct node{ int x,s; node(int _x,int _s){ x=_x, s=_s; } }; int n,m,k,sx,sy; char graph[105][105]; int px[5],py[5]; int dp[105][105][35]; int