HDU 4770 DFS状压

news/2024/10/22 16:40:54/

一个n*m的房间有的房间是可破坏的,其他不可破坏,现在给你一些L型的灯,其中只有一个可以旋转,其他不能,让你用最少的灯覆盖所有的可破坏区域,且不能覆盖不可破坏的区域。

枚举旋转的灯,对剩下的DFS即可,状压存储已经被点亮的灯

#include "stdio.h"
#include "string.h"struct P
{int x,y;
}p[21];int ans,n,m,cnt,aim,b[21];
char str[210][210];int judge(int x,int y)
{if (x>=0 && x<n && y>=0 && y<m && str[x][y]=='#') return 0;return 1;
}void dfs(int k,int sum,int mark,int light)
{int i,j,ll;if (sum>=ans) return ;if (light==aim) {ans=sum; return ;}if (k>=cnt) return ;dfs(k+1,sum,mark,light);for (i=k;k<cnt;k++)if (i!=mark){ll=light|b[i];if (judge(p[i].x-1,p[i].y)==0 || judge(p[i].x,p[i].y+1)==0) continue;for (j=0;j<cnt;j++){if (p[i].x-1==p[j].x && p[i].y==p[j].y) ll|=b[j];if (p[i].x==p[j].x && p[i].y+1==p[j].y) ll|=b[j];}dfs(k+1,sum+1,mark,ll);}
}
int main()
{int i,j,mark,light;b[0]=1;for (i=1;i<=16;i++)b[i]=b[i-1]*2;while (scanf("%d%d",&n,&m)!=EOF){if (n+m==0) break;for (i=0;i<n;i++)scanf("%s",str[i]);cnt=0;for (i=0;i<n;i++)for (j=0;j<m;j++)if (str[i][j]=='.'){p[cnt].x=i;p[cnt].y=j;cnt++;}if (cnt==0){printf("0\n");continue;}ans=100000;aim=b[cnt]-1;dfs(0,0,-1,0);for (i=0;i<cnt;i++){if (judge(p[i].x-1,p[i].y) && judge(p[i].x,p[i].y-1)){mark=i;light=b[i];for (j=0;j<cnt;j++){if (p[j].x==p[i].x && p[j].y==p[i].y-1) light|=b[j];if (p[j].x==p[i].x-1 && p[j].y==p[i].y) light|=b[j];}dfs(0,1,mark,light);}if (judge(p[i].x,p[i].y-1) && judge(p[i].x+1,p[i].y)){mark=i;light=b[i];for (j=0;j<cnt;j++){if(p[j].x==p[i].x && p[j].y==p[i].y-1) light|=b[j];if(p[j].x==p[i].x+1 && p[j].y==p[i].y) light|=b[j];}dfs(0,1,mark,light);}if (judge(p[i].x,p[i].y+1) && judge(p[i].x+1,p[i].y)){mark=i;light=b[i];for (j=0;j<cnt;j++){if (p[j].x==p[i].x && p[j].y==p[i].y+1) light|=b[j];if (p[j].x==p[i].x+1 && p[j].y==p[i].y) light|=b[j];}dfs(0,1,mark,light);}}if (ans==100000) printf("-1\n");else printf("%d\n",ans);}return 0;
}



http://www.ppmy.cn/news/147415.html

相关文章

杭电4770

这道题有几个陷阱&#xff1a; 1.灯光可以找到房间以外 2.只有一个可以旋转的灯 3.最多有十五个需要灯光的房间 4.一个房间最多只能有一盏灯 3 3 #.# . . . #.# 这组数据上错了好久。。。 大致解题思路&#xff1a; 记录下来需要灯光的发房间数&#xff0c;对其进行遍历&a…

Core i7-4770K的详细性能

新品发布前总能看到一些规格、性能方面的偷跑&#xff0c;但大多都是零零碎碎的&#xff0c;关键时刻还得看权威大站。Toms Hardware今天放出猛料&#xff0c;公布了Intel Haswell处理器家族旗舰型号Core i7-4770K的详细性能&#xff0c;基本可以对下代平台有个整体的印像了。 …

P4770 [NOI2018]你的名字

蒟蒻表示不会sam凉凉了&#xff0c;所以只能提高SA技巧&#xff1f; 题意&#xff1a;有一个串\(A\)&#xff0c;每次选择一个\(A\)的子串\(A\)&#xff0c;以及串\(B\)&#xff0c;问\(B\)的所有本质不同子串中不在\(A\)中的串的数量。 &#xff08;定义\(A_i\)表示以字符\(A_…

hdu4770 状态压缩+枚举

http://acm.hdu.edu.cn/showproblem.php?pid4770 Problem Description Harry: "But Hagrid. How am I going to pay for all of this? I havent any money." Hagrid: "Well theres your money, Harry! Gringotts, the wizard bank! Aint no safer place. Not…

BZOJ4770: 图样 (随机点值求异或最小生成树边权和)

题目描述&#xff1a; n ≤ 50 , m ≤ 8 n\le50,m\le8 n≤50,m≤8 题目分析&#xff1a; 根据最小生成树有小到大加入边可以将点按照二进制最高位分组&#xff0c;统计所有情况的边权和。 Code&#xff1a; #include<bits/stdc.h> #define maxn 55 #define maxm 9 u…

【JZOJ4770】闭门造车

Description 自从htn体验了一把飙车的快感&#xff0c;他就下定决心要闭门造车&#xff01;但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店。 一走进商店&#xff0c;玲琅满目的各式零件看得htn眼花缭乱。但是他很快便反应过来:我只要买一套好的零件就行…

chmod 4770的第一位解释

权限标志通过三个“位”来定义&#xff0c;分别是&#xff1a; setuid&#xff1a;设置使文件在执行阶段具有文件所有者的权限。比如/usr/bin/passwd&#xff0c;如果一般用户执行该文件&#xff0c;则在执行过程中&#xff0c;该文件可以获得root权限&#xff0c;从而可以更改…

Jzoj4770 闭门造车

自从htn体验了一把飙车的快感&#xff0c;他就下定决心要闭门造车&#xff01;但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店。 一走进商店&#xff0c;玲琅满目的各式零件看得htn眼花缭乱。但是他很快便反应过来:我只要买一套好的零件就行。首先它们的性…