暴力搜索加剪枝,二进制保存状态,set去重~

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
string s[maxn];
struct node {
int x,y;
}Node[];
int N,M,K,H;
int g[maxn][maxn];
int visit[maxn][maxn];
int X[]={,,-,};
int Y[]={,,,-};
int judge (int x,int y) {
if (x>N||x<||y>M||y<) return -;
if (g[x][y]>) return ;
return ;
}
unordered_set<long long> st;
int cnt=;
int hole=;
long long ans=;
int result=;
void bfs () {
queue<node> q;
memset (visit,,sizeof(visit));
int cky=;
for (int i=;i<=N;i++) {
for (int j=;j<=M;j++) {
if (g[i][j]==) continue;
if (visit[i][j]) continue;
int flag=;
int animal=;
visit[i][j]=;
if (g[i][j]==) animal++;
q.push({i,j});
while (!q.empty()) {
node u=q.front();
q.pop();
for (int k=;k<;k++) {
int tx=u.x+X[k];
int ty=u.y+Y[k];
if (g[tx][ty]==) continue;
if (visit[tx][ty]==) continue;
if (judge(tx,ty)==-) {
flag=;
continue;
}
if (g[tx][ty]==) animal++;
if (animal>=) cky=;
visit[tx][ty]=;
q.push({tx,ty});
}
}
if (flag) hole++;
}
}
if (cky==) hole=-;
}
void dfs (int x,int y) {
Node[cnt].x=x;
Node[cnt].y=y;
cnt++;
g[x][y]=;
ans=ans|(1LL<<(x*M+y-));
if (st.count(ans)) {
cnt--;
g[x][y]=;
ans=ans&~(1LL<<(x*M+y-));
return;
}
st.insert (ans);
if (cnt==K) {
hole=;
bfs ();
if (hole==H) result++;
cnt--;
g[x][y]=;
ans=ans&~(1LL<<(x*M+y-));
return;
}
for (int i=cnt-;i>=;i--) {
for (int k=;k<;k++) {
int tx=Node[i].x+X[k];
int ty=Node[i].y+Y[k];
if (judge(tx,ty)==) dfs (tx,ty);
}
}
cnt--;
g[x][y]=;
ans=ans&~(1LL<<(x*M+y-));
}
int main () {
scanf ("%d %d %d %d",&N,&M,&K,&H);
for (int i=;i<=N;i++) cin>>s[i];
for (int i=;i<=N;i++) {
for (int j=;j<M;j++) {
if (s[i][j]=='.') g[i][j+]=;
else g[i][j+]=;
}
}
for (int i=;i<=N;i++) {
for (int j=;j<=M;j++) {
if (!g[i][j]) dfs(i,j);
}
}
printf ("%d\n",result);
return ;
}

PAT T1019 Separate the Animals的更多相关文章

  1. 《转载》PAT 习题

    博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...

  2. PAT Judge

    原题连接:https://pta.patest.cn/pta/test/16/exam/4/question/677 题目如下: The ranklist of PAT is generated fr ...

  3. PAT/字符串处理习题集(二)

    B1024. 科学计数法 (20) Description: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+ ...

  4. PAT 1041. 考试座位号(15)

    每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...

  5. PAT 1040. 有几个PAT(25)

    字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问 ...

  6. PAT 1032. 挖掘机技术哪家强(20)

    为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位 ...

  7. pat甲级题解(更新到1013)

    1001. A+B Format (20) 注意负数,没别的了. 用scanf来补 前导0 和 前导的空格 很方便. #include <iostream> #include <cs ...

  8. PAT (Basic Level) Practise 1040 有几个PAT(DP)

    1040. 有几个PAT(25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 字符串APPAPT中包含了两个单 ...

  9. PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)

    1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...

随机推荐

  1. linux建立动态库的软链接

    复制动态库: /home/wmz/anaconda3/lib/ 删除原链接: 建立新链接: /home/wmz/anaconda3/lib/libstdc++.so. 问题的起源是,安装anacond ...

  2. 题解【洛谷P2279】[HNOI2003]消防局的设立

    题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有\(n\)个基地.起初为了节约材料,人类只修建了\(n-1\)条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成 ...

  3. Android学习11

    Android存储概念 File内部存储 通过file=openFileOutput()获得,将数据存储在data/data/+包名+files下面. layout布局文件: <?xml ver ...

  4. 单机架设传奇服务器第47课:定时器OnTimer功能详解

    传奇定时器OnTimer功能详解(泡点.时间触发.任务活动) 定时器功能,是服务端中非常常见的一种功能,常见如:泡点脚本.赌博脚本,任务活动指定时间刷怪,时间触发一些都需要用到OnTimer功能,定时 ...

  5. Getopt::Long - Extended processing of command line options

    use Getopt::Long; my $data   = "file.dat"; my $length = 24; my $verbose; GetOptions (" ...

  6. springBoot日志快速上手简单配置

    默认配置 日志级别从低到高分为: TRACE < DEBUG < INFO < WARN < ERROR < FATAL. 如果设置为 INFO ,则低于 INFO 的信 ...

  7. 安卓开发:图片的显示Mode

    安卓开发中将图片放置在ImageView中展示,涉及到图片显示的模式,跟iOS开发中UIView的contentMode属性是一个意思,在安卓UI元素中使用的属性是scaleType,其中枚举值的效果 ...

  8. keil(MDK)错误记录

    1.a parameter list without types is only allowed in a function definition(没有类型的参数列表只允许在函数定义中使用) 2.Er ...

  9. sping中AOP

    委托代理的概念: 委托类对象就是我们后面说到的"目标对象", 也就是需要[被]代理的对象 target代理类对象就是我们后面说到的"代理对象",目标对象就是需要 ...

  10. 连接(JOIN)

    join 用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. INNER JOIN 从多个表中返回满足 JOIN 条件的所有行. INNER JOIN:如果表中有至少一个匹配,则返回行 L ...