[POJ]1164 The Castle
//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的更多相关文章
- OpenJudge 2815 城堡问题 / Poj 1164 The Castle
1.链接地址: http://bailian.openjudge.cn/practice/2815/ http://poj.org/problem?id=1164 2.题目: 总时间限制: 1000m ...
- POJ 1164:The Castle
The Castle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6677 Accepted: 3767 Descri ...
- POJ 1164 城堡问题【DFS/位运算/种子填充法/染色法】
1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | ...
- POJ --- 1164 放苹果
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24947 Accepted: 15887 Description ...
- poj 1164 深度优先搜索模板题
#include<iostream> //用栈进行的解决: #include<cstdio> #include<algorithm> #include<cst ...
- 计算几何--求凸包模板--Graham算法--poj 1113
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28157 Accepted: 9401 Description ...
- poj 1113:Wall(计算几何,求凸包周长)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28462 Accepted: 9498 Description ...
- 【POJ】1113 Wall(凸包)
http://poj.org/problem?id=1113 答案是凸包周长+半径为l的圆的周长... 证明?这是个坑.. #include <cstdio> #include <c ...
- poj 题目分类(1)
poj 题目分类 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K--0.50K:中短代码:0.51K--1.00K:中等代码量:1.01K--2.00K:长代码:2.01 ...
随机推荐
- Java程序员都应该去使用一下这款强大的国产工具类库
这不是标题党,今天给大家推荐一个很棒的国产工具类库:Hutool.可能有很多朋友已经知道这个类库了,甚至在已经在使用了,如果你还没有使用过,那不妨去尝试一下,我们项目组目前也在用这个.这篇文章来简单介 ...
- 黑马Stream流学习 Stream流 函数式接口 Lambda表达式 方法引用
- js 左侧树添加选择样式
选择样式添加 menuToggle: function() { var menus = $('.nav-primary').children('li'); var tog = menus.has('. ...
- Ubuntu安装指定版本的docker
系统环境: Ubuntu 16.0.4 安装版本: docker 17.03.2 在进现在这家公司初期,需要使用rancher部署一个k8s集群,由于rancher也是由docker启动的,加上k8 ...
- KEIL_RTX资源介绍
调度方法:时间片轮转. 参考文档:Keil参考手册和rtl.h(任务的每个.c文件都应包含此头文件)头文件这两个文档 1)事件管理:让一个进程等待一个事件,这个事件可以由其它进程和中断触发(只能在中断 ...
- Unity Shader入门精要学习笔记 - 第13章 使用深度和法线纹理
线纹理的代码非常简单,但是我们有必要在这之前首先了解它们背后的实现原理. 深度纹理实际上就是一张渲染纹理,只不过它里面存储的像素值不是颜色值而是一个高精度的深度值.由于被存储在一张纹理中,深度纹理里的 ...
- php出现Warning: file_put_contents,failed to open stream
Warning: file_put_contents(D:/wwwroot/jinxiongdi/web/temp/caches/f/index_40F756F0.php) [function.fil ...
- 让linux下的eclipse支持GBK编码
原文链接:http://leaze.blog.51cto.com/83088/195584 今天,把windows下的工程导入到了Linux下eclipse中,由于以前的工程代码,都是GBK编码的,而 ...
- vue2.0:(一)、vue的安装和项目搭建(以外卖app项目举例)
vue系列踩坑大作战由此就要开始了,准备好了吗,和我一起踩坑,学会vue吧.同时,也欢迎大家把自己遇到的坑发出来,让更多的人学会vue,因为我深知前端学习新框架不容易,尤其是我这种半路出家的女前端.不 ...
- javascript 流程控制及函数
回顾 基本语法 在html的使用 <script></script> 注释 ///* */ 指令结束符 ;换行 输出 console.log()document.write() ...