hdu 4771 状态压缩搜索

基本上和胜利大逃亡一样!!!!!!!!

#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;

int mark[110][110][1<<6],n,m;
char map[110][110];
int leap[110][110];
struct node
{
    int x,y,step;
    int state;
    int cont;
}a,b;
int dir[4][2]={-1,0,0,1,0,-1,1,0};
int bfs(int x,int y,int num)
{  

    queue<node>q;
    a.x=x;
    a.y=y;
    a.step=0;
    a.state=0;
    a.cont=0;
    if(leap[x][y])
    {
        a.state=(1<<leap[x][y]);
        a.cont=1;
    }
    memset(mark,0,sizeof(mark));
    mark[a.x][a.y][a.state]=1;
    q.push(a);
    int flash=0;
    while(!q.empty())
    {
        b=q.front();
        q.pop();
        if(b.cont==num)
        {
            printf("%d\n",b.step);
            flash=1;
            break;
        }
        for(int i=0;i<4;i++)
        {
            a.x=b.x+dir[i][0];
            a.y=b.y+dir[i][1];
            a.step=b.step+1;
            if(a.x<0||a.x>=n||a.y<0||a.y>=m) continue;
            if(map[a.x][a.y]==‘#‘) continue;
            if(leap[a.x][a.y])
            {
                if((b.state&(1<<leap[a.x][a.y]))==0) a.cont=b.cont+1;
                else a.cont=b.cont;
                a.state=b.state|(1<<leap[a.x][a.y]);
            }
            else
            {
                a.state=b.state;
                a.cont=b.cont;
            }
            if(mark[a.x][a.y][a.state]==0)
            {
                mark[a.x][a.y][a.state]=1;
                q.push(a);
            }
        }
    }
    if(!flash) printf("-1\n");
    return 0;
}
int main()
{
    int i,j,a,b;
    while(~scanf("%d%d",&n,&m))
    {
        if(n+m==0) break;
        for(i=0;i<n;i++)
        scanf("%s",map[i]);
        int s;
        scanf("%d",&s);
        memset(leap,0,sizeof(leap));
        j=0;
        for(i=1;i<=s;i++)
        {
            scanf("%d%d",&a,&b);
            leap[a-1][b-1]=++j;
        }
        int x,y;
        for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        if(map[i][j]==‘@‘)
        {
            x=i;
            y=j;
        }
        bfs(x,y,s);
    }
    return 0;
}
时间: 2024-10-30 06:47:21

hdu 4771 状态压缩搜索的相关文章

HDU 1885 Key Task 状态压缩+搜索

点击打开链接 Key Task Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1176    Accepted Submission(s): 462 Problem Description The Czech Technical University is rather old - you already know that it c

hdu 5180 状态压缩 dp 打表

hdu 5180 状态压缩 dp 打表 题意: 在n*n的国际象棋中,放置若干个国王和k个车,使得国王之间不互相攻击,车之间不互相攻击,车不可攻击到国王(这并不代表国王不能攻击到车).国王能攻击到它上下左右,左上左下右上右下八个位置的棋子,车可以攻击到同一行或同一列中的棋子,求方案总数对1000000007取模后的值. 限制: 1 <= n <=15; 0 <= k <=15 思路: 状态压缩,dp,打表套打表 打表程序如下: 打表程序1: tab[a][b]表示a*b的棋盘王的放

hdu 4917Permutation(状态压缩DP)

hdu 4917Permutation(状态压缩DP) 题意:将1~n的n个数排列成序列(n<=40),但有m(m<=20)个限制条件,其中第i个限制条件的表示为ai,bi.表示该序列的第ai的数要小于第bi的.问有多少中排列?保证有解 解法:我们首先可以明确一点,这m个限制条件,所表示的关系会构成若干个DAG(有向无环图,我将其称之为拓扑图).我们只要将这n个数,填入到拓扑图上,使其满足拓扑关系,那么这样的序列就是可以的.而这若干个拓扑图之间,是不会相互影响的,因而我们可以单独考虑每一个拓扑

HDU 2553 状态压缩

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 23888    Accepted Submission(s): 10639 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求

POJ 1632 Vase collection【状态压缩+搜索】

题目传送门:http://poj.org/problem?id=1632 Vase collection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2308   Accepted: 901 Description Mr Cheng is a collector of old Chinese porcelain, more specifically late 15th century Feng dynasty vase

[HDU]5094Maze(状态压缩BFS)

状态压缩的题,第一次WA了,怎么改都不对,交了十几遍,之后重新写了一个,1A了 #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; const int maxn = 51; const int dir[4][2] = {{0,1},{-1,0},{0,-1},{1,0}}; int n,m,t; int door[maxn][m

hdu 3006(状态压缩)

The Number of set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1301    Accepted Submission(s): 795 Problem Description Given you n sets.All positive integers in sets are not less than 1 and n

hdu 5135 状态压缩dp

题意是给出最对12条边你     问最大可组成三角形面积是多大 (可有多个三角形)   典型的状态压缩  (最多12条边) 思路: 先暴力枚举所有可能三角形的面积   然后再根据状态压缩来做    最多可组成n/3个三角形  对每个三角形都记录三边或(运算)    和面积    然后判断进行合并  (根据且运算)   就行了 #include<stdio.h> #include<string.h> #include<cmath> #include<iostream

hdu 3811 状态压缩

题意就不对说了:  开始想用深搜过  感觉数据水的话应该能过,  哈哈  还是超时了!!! 正确做法应该是状态压缩吧,n小于等于17    2^17-1种状态,每种状态表示对应的数用没用过,如果用状态压缩dp的思路(从小状态跑到大状态)的话就不对了,开始一直没想明白,仔细想想也是,如果按以前的 就会改变dp里面的值,实际上对每一种状态的值是一定的,还有就是为什么要跑结果的对立面,看看测试数据   ,两个要求之间是有重复的,比如1,1和2,2    这样跑起来就不方便. 跑的时候三重for   外