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 著名的快速排序算法里有一个经典的划分 ...
随机推荐
- Go第三方库之tail
Tail Demo // tail.TailFile()函数开启goroutine去读取文件,通过channel格式的t.lines传递内容. t, err := tail.TailFile(&quo ...
- Git - 03. git 工作空间
1. 概述 git 存放代码的地方 2. 创建 命令 # 1. 从无到有 > git init # 2. 从远程拉去现有的仓库 > git clone <url> 3. 文件生 ...
- py2
函数相关的 # 生成器相关的# 例1 ll = sum(i for i in range(100000000)) #生成器占资源少 # 例2 def demo(): for i in range(4) ...
- jango 模型管理数据model,数据库外键主键与一对一,一对多,多对多关系
四.models.py 定义和管理模型: 4.1模型class的属性就映射与数据库的字段参数 继承models.Model class TestClass(models.Model): 4.2在数据库 ...
- 关于宽搜BFS广度优先搜索的那点事
以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...
- PAT 1017 Queueing at Bank (模拟)
Suppose a bank has K windows open for service. There is a yellow line in front of the windows which ...
- 浅谈hover用法
在前端页面制作中,我们时常要用到移动显示.隐藏的动态效果,我们一般采用js来实现此效果.不过在大部分情况下,我们也可以使用hover来实现此动态效果. 在此,我谈一谈我对hover的用法,请看以下代码 ...
- JAVA-替换html中图片的路径-从html代码中提取图片路径并下载(完整版)
transHtml方法实现提取网络图片中得图片路径,将其重新下载到本地,并替换html中原来得路径 package com.googosoft.until; import java.io.Buffer ...
- 【Struts APP_PATH】StartSystemListener
StartSystemListener package k.filter; import javax.servlet.ServletContext; import javax.servlet.Serv ...
- C语言:根据以下公式计算s,s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) -在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,
//根据一下公式计算s,并将计算结果作为函数返回值,n通过形参传入.s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) #include <stdio.h> ...