hdu4770Lights Against Dudely 暴力搜索

//n*m grid
//一个灯的照亮区域为(x,y),(x-1,y) ,(x,y+1)
//问最少用多少个灯等可以将‘.‘区照亮而不会照到‘#’区
//其中有一个灯可以的照亮区域可以旋转0,90,180,270度
//由于题目已知‘.‘区的个数少于15,可以直接爆搜‘.‘区是否放灯
//选好哪些区域放灯后枚举,是哪个灯可以旋转,旋转的角度
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 210 ;
char map[maxn][maxn] ;
int vis[maxn][maxn] ;
int x[maxn] , y[maxn] ;
int len_a ,a[maxn];
int ans ;int len ;
int dx[4][3] = {{0,-1,0},{0,0,1},{0,1,0},{0,0,-1}};
int dy[4][3] = {{0,0,1},{0,1,0},{0,0,-1},{0,-1,0}};
bool judge()
{
    int hash[20] ;
    for(int i = 1;i <= len_a ;i++)
    for(int j = 0;j < 4;j++)
    {
         memset(hash , 0 , sizeof(hash)) ;
         int flag = 0 ;
         for(int k = 0;k < 3;k++)
         {
             int u = x[a[i]] + dx[j][k] ;
             int v = y[a[i]] + dy[j][k] ;
             hash[vis[u][v]] =  1 ;
             if(map[u][v] == ‘#‘)
             {flag = 1 ; break;}
         }
         if(flag)continue ;
         for(int k = 1;k <= len_a ;k++)
         {
             if(k == i)continue ;
             flag = 0 ;
             for(int s = 0 ;s < 3;s++)
             {
                 int u = x[a[k]] + dx[0][s] ;
                 int v = y[a[k]] + dy[0][s] ;
                 hash[vis[u][v]] = 1;
                 if(map[u][v] == ‘#‘)
                 {flag = 1 ; break;}
             }
             if(flag){flag = 1 ;break;}
         }
         if(flag)continue;
         for(int k = 1;k  <= len ;k++)
         if(!hash[k]){flag = 1 ; break;}
         if(!flag)return true ;
    }
    return false ;
}
void dfs(int pos , int num)
{
    if(pos == len + 1 )
    {
        if(judge())
        ans = min(ans , num) ;
        return ;
    }
    dfs(pos + 1, num) ;
    a[++len_a] = pos ;
    dfs(pos+1 , num + 1) ;
    len_a--;
}
int main()
{
    //freopen("in.txt" ,"r" , stdin) ;
    int n , m ;
    while(~scanf("%d%d" ,&n , &m)&&(n+m))
    {
        len = 0;
        memset(vis , 0 , sizeof(vis)) ;
        memset(map , 0 ,sizeof(map)) ;
        for(int i = 1;i <= n;i++)
        {
            scanf("%s" , &map[i][1]) ;
            for(int j = 1;j <= m;j++)
            if(map[i][j] == ‘.‘)
            x[++len] = i ,y[len] = j , vis[i][j] = len ;
        }
        if(len == 0){puts("0");continue ;}
       ans = 20;len_a = 0 ;
       dfs(1 ,0);
       if(ans==20)puts("-1") ;
       else
       printf("%d\n" ,ans) ;
    }
    return 0 ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 07:44:27

hdu4770Lights Against Dudely 暴力搜索的相关文章

hdu 4770 Lights Against Dudely 暴力搜索

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4770 题目大意是让你放一些灯照亮一些房间 灯不可以照到某些特殊房间 但可以照出边界 灯光必须覆盖所有可以放灯的房间 求至少需要多少灯 搜索题 应该注意到冗长而无聊的题面中有告诉你最多只有15个可以放灯的房间 所以2^15来枚举 还应该注意到冗长而无聊的题面中有告诉你最多只有1个灯可以转向 所以还应该枚举哪个灯来转向 转向再枚举4个方向 然后判断是否成立 为了简化问题 单独把那些可放灯空间拿出来 最多

[暴力搜索] POJ 3087 Shuffle&#39;m Up

Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10003   Accepted: 4631 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks o

HDU 3699 A hard Aoshu Problem (暴力搜索)

题意:题意:给你3个字符串s1,s2,s3;要求对三个字符串中的字符赋值(相同的字符串进行相同的数字替换), 替换后的三个数进行四则运算要满足左边等于右边,求有几种解法. Sample Input 2 A A A BCD BCD B Sample Output 5 72 eg:ABBDE   ABCCC   BDBDE :令 A = 1, B = 2, C = 0, D = 4, E = 5 12245 + 12000 = 24245: 注意没有前导零!! #include<stdio.h>

HDU 4499 Cannon (暴力搜索)

题意:在n*m的方格里有t个棋子,问最多能放多少个炮且每个炮不能互相攻击(炮吃炮) 炮吃炮:在同一行或同一列且中间有一颗棋子. #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <math.h> #define M 50 #define LL long long using

poj 1054 The Troublesome Frog (暴力搜索 + 剪枝优化)

题目链接 看到分类里是dp,结果想了半天,也没想出来,搜了一下题解,全是暴力! 不过剪枝很重要,下面我的代码 266ms. 题意: 在一个矩阵方格里面,青蛙在里面跳,但是青蛙每一步都是等长的跳, 从一个边界外,跳到了另一边的边界外,每跳一次对那个点进行标记. 现在给你很多青蛙跳过后的所标记的所有点,那请你从这些点里面找出 一条可能的路径里面出现过的标记点最多. 分析:先排序(目的是方便剪枝,break),然后枚举两个点,这两个 点代表这条路径的起始的两个点.然后是三个剪枝,下面有. 开始遍历时,

hdu 1399 Starship Hakodate-maru (暴力搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1399 题目大意:找到满足i*i*i+j*(j+1)*(j+2)/6形式且小于等于n的最大值. 1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 while(scanf("%d",&n),n) 10 { 11 int j,

ACM 暴力搜索题 题目整理

UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vector> #include<cmath> #include<map> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include

Codeforces Round #224 (Div. 2) D 暴力搜索加记忆化

题意读了半年,英语太渣,题意是摆两个棋子在棋盘上作为起点,但是起点不能在#上,然后按照图的指示开始走, < 左 > 右 ^上 v下,走的时候只能按照图的指示走,如果前方是 #的话,可以走进去,但是 走进去之后便不能再走了,走的途中两个棋子不能相碰,但是最终都走到同一个#里是没事的,并且若是能走 无限步的话 输出 -1, 例如  > < 这样左右左右的走就能无限走,然后问你 两个棋子走的最大步数的和 一开始被输出-1给困住了,因为除了 .> <这样以外  还可以刚好形成一

POJ 2329 (暴力+搜索bfs)

Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3943 Accepted: 1210 Description Input is the matrix A of N by N non-negative integers. A distance between two elements Aij and Apq is defined as |i ? p| + |j ? q|. Your pro