hdu 4770 状态压缩模拟

news/2024/11/24 14:01:13/

直接状态压缩枚举所有状态判断是否可行,从所有可行方案中找最小的。

题目最大的坑点在于,题目说的是15个点,但亲测最多有16个点,我屮艸芔茻。。。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>using namespace std;int v[1<<16];
char mp[222][222];
int mark[222][222];
int x[20];
int y[20];
int xx[4][3]={0,-1,0,0,1,0,0,0,1,0,-1,0};
int yy[4][3]={0,0,1,0,0,1,0,-1,0,0,0,-1};
int n,m,cnt,s1,s2;void init()
{int m=1<<16-1;      //改成15立马WA,我屮艸芔茻memset(v,0,sizeof(v));for (int i=1;i<=m;i++){int t=i;while (t>0){if (t&1)v[i]++;t>>=1;}}return ;
}void build(int i,int k)
{for (int t=0;t<3;t++)   //重构现场{int nx=x[i]+xx[k][t];int ny=y[i]+yy[k][t];if (nx>n||nx<1||ny>m||ny<1)continue ;if (mp[nx][ny]=='#'){mark[nx][ny]++;if (mark[nx][ny]==1)s2++;}else{mark[nx][ny]++;if (mark[nx][ny]==1)s1++;}}
}void restore(int i,int k)
{for (int t=0;t<3;t++)   //还原现场{int nx=x[i]+xx[k][t];int ny=y[i]+yy[k][t];if (nx>n||nx<1||ny>m||ny<1)continue ;if (mp[nx][ny]=='#'){mark[nx][ny]--;if (mark[nx][ny]==0)s2--;}else{mark[nx][ny]--;if (mark[nx][ny]==0)s1--;}}
}bool getnext(int st)
{memset(mark,0,sizeof(mark));s1=0;s2=0;for (int i=0;i<cnt;i++)     //构造初始的状态形成的覆盖情况if (st&(1<<i))build (i,0);if (s1==cnt&&s2==0)     //如果初始的覆盖已经满足题意,则返回truereturn true;for (int i=0;i<cnt;i++){if (st&(1<<i)){restore(i,0);   //将这个点按照初始形式放的情况删掉for (int k=1;k<=3;k++){build(i,k);     //重构这个节点的新覆盖情况if (s1==cnt&&s2==0)return true;restore(i,k);   //删除这个节点的新覆盖情况}build(i,0);     //重构这个节点的初始构造情况}}return false;
}int main()
{init();while (scanf("%d%d",&n,&m)&&n+m){for (int i=1;i<=n;i++)scanf("%s",mp[i]+1);cnt=0;for (int i=1;i<=n;i++){for (int t=1;t<=m;t++){if (mp[i][t]=='.'){x[cnt]=i;y[cnt]=t;cnt++;}}}int mm=(1<<cnt)-1;int ans=999;for (int i=0;i<=mm;i++){if (v[i]>=ans)continue ;if (getnext(i))ans=v[i];}if (ans==999)ans=-1;printf("%d\n",ans);}
}



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

相关文章

hdu 4770 Lights Against Dudely

用离中心距离为1的L去覆盖最多十五个点&#xff0c;#不能被覆盖&#xff0c;可以覆盖的地方可以越界&#xff0c;有一个L可以是旋转0&#xff0c;90&#xff0c;180&#xff0c;270去覆盖的 问&#xff0c;最少要多少个L可以实现全覆盖。 枚举可旋转的L所在的位置&#xff0c…

HDU 4770 DFS状压

一个n*m的房间有的房间是可破坏的&#xff0c;其他不可破坏&#xff0c;现在给你一些L型的灯&#xff0c;其中只有一个可以旋转&#xff0c;其他不能&#xff0c;让你用最少的灯覆盖所有的可破坏区域&#xff0c;且不能覆盖不可破坏的区域。 枚举旋转的灯&#xff0c;对剩下的…

杭电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眼花缭乱。但是他很快便反应过来:我只要买一套好的零件就行…