//markdown复制进来一堆问题 还是链接方便点

POJ 1164 The Castle

首先想到用9个方格来表示一个房间,如此一来复杂许多,MLE代码如下:

//Writer:GhostCai && His Yellow Duck

#include<iostream>
#define MAXN 50
using namespace std; int m,n;
int a[MAXN][MAXN];
bool vis[MAXN][MAXN]; void opet(int num,int x,int y){
bool up=0,dn=0,lf=0,rt=0;//!!!
if(num>=8){
dn=1;
num-=8;
}
if(num>=4){
rt=1;
num-=4;
}
if(num>=2){
up=1;
num-=2;
}
if(num>=1){
lf=1;
}
a[x*2][y*2]=2;
if(up) a[x*2-1][y*2]=1,a[x*2-1][y*2+1]=1,a[x*2-1][y*2-1]=1;
if(dn) a[x*2+1][y*2]=1,a[x*2+1][y*2+1]=1,a[x*2+1][y*2-1]=1;
if(lf) a[x*2][y*2-1]=1,a[x*2+1][y*2-1]=1,a[x*2-1][y*2-1]=1;
if(rt) a[x*2][y*2+1]=1,a[x*2+1][y*2+1]=1,a[x*2-1][y*2+1]=1; } void dfs(int x,int y){
if(vis[x][y]) return;
if(x<1||x>m*2+1||y<1||y>n*2+1) return;
if(a[x][y]==1) return;
if(a[x][y]!=0) vis[x][y]=1;//!!
if(a[x][y]==2) a[x][y]=-1;
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y+1);
dfs(x,y-1);
} int calc(){
int cnt=0;
for(register int i=1;i<=m*2+1;i++){
for(register int j=1;j<=n*2+1;j++){
if(a[i][j]==-1){
cnt++;
a[i][j]=2;
}
}
} return cnt;
} int main(){
cin>>m>>n;
int i,j;
int r;
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
cin>>r;
opet(r,i,j);
}
}
int ans=0,mx=0,cnt=0;
for(i=1;i<=m*2+1;i++) a[i][1]=1,a[i][n*2+1]=1;
for(i=1;i<=n*2+1;i++) a[1][i]=1,a[m*2+1][i]=1; // for(i=1;i<=m*2+1;i++){
// for(j=1;j<=n*2+1;j++){
// cout<<a[i][j]<<" ";
// }
// cout<<endl;
// } for(i=1;i<=m*2+1;i++){
for(j=1;j<=n*2+1;j++){
if(!vis[i][j]&&a[i][j]==2){
dfs(i,j);
cnt++;
ans=calc();
mx=max(ans,mx);
}
}
}
cout<<cnt<<endl<<mx<<endl;
return 0;
}

百般无奈下,重新思路。

想到其实没必要用9个方格,一个就挺好。

只不过在搜索的时候,利用数字判断一下这个方向走不走。

注意的一点是局部变量要赋初值,dfs里四个布尔位置变量一开始没有赋初值,导致奇怪的结果。

还是很像swim,嗯。

//Writer:GhostCai && His Yellow Duck

#include<iostream>
#define MAXN 200
using namespace std; int m,n;
int a[MAXN][MAXN];
bool vis[MAXN][MAXN]; void dfs(int x,int y){
if(vis[x][y]) return;
if(x<1||x>m||y<1||y>n) return;
int d=a[x][y];
vis[x][y]=1;//!!
a[x][y]+=666;
bool lf=0,rt=0,up=0,dn=0;//!!!
if(d>=8){
d-=8;
dn=1;
}
if(d>=4){
d-=4;
rt=1;
}
if(d>=2){
up=1;
d-=2;
}
if(d>=1){
lf=1;
}
if(!lf) dfs(x,y-1);
if(!rt) dfs(x,y+1);
if(!dn) dfs(x+1,y);
if(!up) dfs(x-1,y); } int calc(){
int cnt=0;
for(register int i=1;i<=m;i++){
for(register int j=1;j<=n;j++){
if(a[i][j]>16){
cnt++;
a[i][j]-=666;
}
}
} return cnt;
} int main(){
int ans=0,mx=0,cnt=0;
cin>>m>>n;
int i,j;
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
if(!vis[i][j]){
dfs(i,j);
cnt++;
ans=calc();
mx=max(mx,ans);
}
}
}
cout<<cnt<<endl<<mx<<endl;
}

[POJ]1164 The Castle的更多相关文章

  1. OpenJudge 2815 城堡问题 / Poj 1164 The Castle

    1.链接地址: http://bailian.openjudge.cn/practice/2815/ http://poj.org/problem?id=1164 2.题目: 总时间限制: 1000m ...

  2. POJ 1164:The Castle

    The Castle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6677   Accepted: 3767 Descri ...

  3. POJ 1164 城堡问题【DFS/位运算/种子填充法/染色法】

    1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | ...

  4. POJ --- 1164 放苹果

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24947   Accepted: 15887 Description ...

  5. poj 1164 深度优先搜索模板题

    #include<iostream> //用栈进行的解决: #include<cstdio> #include<algorithm> #include<cst ...

  6. 计算几何--求凸包模板--Graham算法--poj 1113

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28157   Accepted: 9401 Description ...

  7. poj 1113:Wall(计算几何,求凸包周长)

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28462   Accepted: 9498 Description ...

  8. 【POJ】1113 Wall(凸包)

    http://poj.org/problem?id=1113 答案是凸包周长+半径为l的圆的周长... 证明?这是个坑.. #include <cstdio> #include <c ...

  9. poj 题目分类(1)

    poj 题目分类 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K--0.50K:中短代码:0.51K--1.00K:中等代码量:1.01K--2.00K:长代码:2.01 ...

随机推荐

  1. redis-分布式锁2

    https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/ 站在巨人的肩膀上 本博客使用第三方开源组件Jedis实现Redis客户 ...

  2. ebullient(2018.10.25)

    结论巨好想,每一次操作可以看作把一个b往前移一位,另一个b往后移一位,逆序对个数不改变,判断即可做第一问. 此处代码仅给出第一问做法: #include<cstdio> #include& ...

  3. [题解](tarjan割点/点双)luogu_P3225_矿场搭建

    首先和割点有关,求割点,然后这些割点应该把这个图分成了多个点双,可以考虑点双的缩点,假如缩点做的话我们要分析每个点双的性质和贡献 先拿出一个点双来,如果它没有连接着割点,那么至少要建两个,以防止其中一 ...

  4. django_logging

    django使用python自带的logging打印日志 logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志输出 ...

  5. 牛客寒假6-B.煤气灶

    链接:https://ac.nowcoder.com/acm/contest/332/B 题意: 小j开始打工,准备赚钱买煤气灶. 第一天,小j的工资为n元,之后每天他的工资都比前一天多d元. 已知煤 ...

  6. centos下gitlab的简单安装配置

    一.安装前配置yum源 #wget https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh #s ...

  7. 模拟IO 读写压力测试

    #### 本实验室通过创建一个测试表myTestTable ,分配在一个足够大小的表空间. ###然后通过 insert select 方式,创建100个后台进程进行读写操作,每个后台进程预计时间20 ...

  8. 106 Construct Binary Tree from Inorder and Postorder Traversal 从中序与后序遍历序列构造二叉树

    给定一棵树的中序遍历与后序遍历,依据此构造二叉树.注意:你可以假设树中没有重复的元素.例如,给出中序遍历 = [9,3,15,20,7]后序遍历 = [9,15,7,20,3]返回如下的二叉树:    ...

  9. Dubbo理论知识

    本文是作者根据官方文档以及自己平时的使用情况,对 Dubbo 所做的一个总结.如果不懂 Dubbo 的使用的话,可以参考我的这篇文章<超详细,新手都能看懂 !使用SpringBoot+Dubbo ...

  10. jq中的attr和prop属性

    今天在做checkbox的全选等功能时刚开始用的是 $('input[type='checkbox']").attr("checked","true" ...