PAT T1019 Separate the Animals
暴力搜索加剪枝,二进制保存状态,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的更多相关文章
- 《转载》PAT 习题
博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...
- PAT Judge
原题连接:https://pta.patest.cn/pta/test/16/exam/4/question/677 题目如下: The ranklist of PAT is generated fr ...
- PAT/字符串处理习题集(二)
B1024. 科学计数法 (20) Description: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+ ...
- PAT 1041. 考试座位号(15)
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...
- PAT 1040. 有几个PAT(25)
字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问 ...
- PAT 1032. 挖掘机技术哪家强(20)
为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位 ...
- pat甲级题解(更新到1013)
1001. A+B Format (20) 注意负数,没别的了. 用scanf来补 前导0 和 前导的空格 很方便. #include <iostream> #include <cs ...
- PAT (Basic Level) Practise 1040 有几个PAT(DP)
1040. 有几个PAT(25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 字符串APPAPT中包含了两个单 ...
- PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
随机推荐
- Spring AOP编程(二)-AOP实现的三种方式
AOP的实现有三种方式: l aop底层将采用代理机制进行实现. l 接口 + 实现类 :spring采用 jdk 的动态代理Proxy. l 实现类: ...
- java 面试架构篇
1.非功能需求会考虑哪些? 可用性.扩展性.性能: 2.有没有遇到过建了索引反而变慢的情况? 3.从哪些角度去设计系统? 4.代码中使用过的设计模式?
- 【音乐欣赏】《Forget》 - The Tech Thieves
曲名:Forget 作者:The Tech Thieves [00:00.000] 作曲 : Mark Emmanuel/Alia May Plesa-Topham [00:01.000] 作词 : ...
- 2019冬季PAT甲级第二题
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; typedef struct{ int ...
- 作业1:使用go搭建一个web-server
todo1:搭建web-server的原理 todo2:go实现web-server
- MYSQL内置函数【转】
一.MySQL 字符串函数 函数 描述 实例 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码. 返回 CustomerName 字段第一个字母的 ASCII 码: SELECT AS ...
- LAMP调优
1.编译安装httpd前修改: 在安装包目录下 vim include/ap_release.h 搜索:BASEVENDOR 修改其八项隐藏curl -I http://地址 中的Server ...
- linux中利用fstab实现磁盘分区自动挂载
如何格式化磁盘.给磁盘分区以及挂载,参考我的另一篇博客: https://www.cnblogs.com/mediocreWorld/p/11123786.html 博客中有一个格式化分区的命令: m ...
- rsync+inotify实现主机之间目录实时同步
原理: rsync:用于跨主机目录同步 inotify:用于监测目录变化 再编写一个触发脚本,一旦inotify检测到目录中内容发生变化,则调用rsync执行同步. rsync服务器的的配置: 因为r ...
- MySQLroot密码的恢复方法
MySQLroot密码的恢复方法 有可能你的系统没有 safe_MySQLd 程序(比如我现在用的 ubuntu操作系统, apt-get安装的MySQL) , 下面方法可以恢复 1.停止MySQLd ...