P1457 城堡

2024-02-11 16:50
文章标签 城堡 p1457

本文主要是介绍P1457 城堡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张“幸运爱尔兰”(一种彩票)。结果这张彩票让他获得了这次比赛唯一的奖品——坐落于爱尔兰郊外的一座梦幻般的城堡!

喜欢吹嘘的农夫约翰立刻回到有着吹嘘传统的威斯康辛老家开始吹嘘了, 农夫约翰想要告诉他的奶牛们关于他城堡的一切。他需要做一些吹嘘前的准备工作:比如说知道城堡有多少个房间,每个房间有多大。另外,农夫约翰想要把一面单独的墙(指两个单位间的墙)拆掉以形成一个更大的房间。 你的工作就是帮农夫约翰做以上的准备,算出房间数与房间的大小。

城堡的平面图被划分成M*N(1 <=M,N<=50)个正方形的单位,一个这样的单位可以有0到4面墙环绕。城堡周围一定有外墙环绕以遮风挡雨。(就是说平面图的四周一定是墙。)

请仔细研究下面这个有注解的城堡平面图:

友情提示,这个城堡的平面图是7×4个单位的。一个“房间”的是平面图中一个由“#”、“-”、“|”围成的格子(就是图里面的那一个个的格子)。比如说这个样例就有5个房间。(大小分别为9、7、3、1、8个单位(排名不分先后))

移去箭头所指的那面墙,可以使2个房间合为一个新房间,且比移去其他墙所形成的房间都大。(原文为:Removing the wall marked by the arrow merges a pair of rooms to make the largest possible room that can be made by removing a single wall. )

城堡保证至少有2个房间,而且一定有一面墙可以被移走。

输入输出格式
输入格式:
第一行有两个整数:M和N 城堡的平面图用一个由数字组成的矩阵表示,一个数字表示一个单位,矩阵有N行M列。输入与样例的图一致。

每一个单位的数字告诉我们这个单位的东西南北是否有墙存在。每个数字是由以下四个整数的某个或某几个或一个都没有加起来的。

1: 在西面有墙

2: 在北面有墙

4: 在东面有墙

8: 在南面有墙

城堡内部的墙会被规定两次。比如说(1,1)南面的墙,亦会被标记为(2,1)北面的墙。

输出格式:
输出包含如下4行:

第 1 行: 城堡的房间数目。

第 2 行: 最大的房间的大小

第 3 行: 移除一面墙能得到的最大的房间的大小

第 4 行: 移除哪面墙可以得到面积最大的新房间。

选择最佳的墙来推倒。有多解时选最靠西的,仍然有多解时选最靠南的。同一格子北边的墙比东边的墙更优先。

用该墙的南邻单位的北墙或西邻单位的东墙来表示这面墙,方法是输出邻近单位的行数、列数和墙的方位(“N”(北)或者"E"(东))。

先用特殊处理将平面图还原,跟方便使用dfs
用dfs实现,枚举每个房间,求出最大面积,并保存,最后按题目要求求出最优解。
usaco城堡题解
以下为源代码:

const z:array[1..4,1..2]of -1..1=((0,-1),(-1,0),(0,1),(1,0));uu:array[1..4]of 1..4=(4,2,3,1);
var i,j,k,i1,j1,k1:longint;m,n,x,y,sum,int,int2,max:longint;a,b:array[-1..500,-1..500]of boolean;c,d:array[-1..500,-1..500]of longint;jz:array[0..100]of longint;u:array[0..10000]of longint;s:string;max_ch:longint;max_x,max_y:longint;sum2:longint;boo:array[1..4]of boolean;
procedure jz_(m:longint); //预处理
begin
//懒得写循环QAQjz[4]:=m div 8;m:=m mod 8;jz[3]:=m div 4;m:=m mod 4;jz[2]:=m div 2;m:=m mod 2;jz[1]:=m;
end;
procedure dfs_1(x,y:longint); //求出答案1,2
var i:longint;
beginif not b[x,y] then exit;b[x,y]:=false;if (x mod 2=1) and (y mod 2=1) theninc(int);for i:=1 to 4 dodfs_1(x+z[i,1],y+z[i,2]); //继续搜索下一步
end;
procedure dfs_2(x,y:longint); //求出答案3
var i:longint;
beginif not b[x,y] then exit;b[x,y]:=false;c[x,y]:=u[int2];d[x,y]:=int2; //方便处理打洞位置for i:=1 to 4 dodfs_2(x+z[i,1],y+z[i,2]); //搜索下一步
end;
beginread(m,n);s:='WNES';//东西南北的处理for i:=1 to n dofor j:=1 to m dobeginread(x);a[i*2-1,j*2-1]:=true;jz_(x);for k:=1 to 4 dobeginif jz[k]=0 thena[i*2-1+z[k,1],j*2-1+z[k,2]]:=true;end;end;b:=a;for i:=1 to n*2-1 dofor j:=1 to m*2-1 dobeginif b[i,j] thenbegininc(int2);dfs_1(i,j);//找联通快u[int2]:=int;if int>max then max:=int;int:=0;end;end;writeln(int2); // 房间数writeln(max); // 最大房间b:=a;int2:=0;for i:=1 to n*2-1 dofor j:=1 to m*2-1 dobeginif b[i,j] thenbegininc(int2);dfs_2(i,j);end;end;max:=0;// 找到打洞处for j:=m downto 1 dofor i:=1 to n dobeginx:=i*2-1;y:=j*2-1;sum:=c[x,y];for i1:=3 downto 2 do//这里看起来比较烦QAQbeginif not a[x+z[i1,1],y+z[i1,2]] and (d[x+z[i1,1]*2,y+z[i1,2]*2]<>d[x,y]) thenbeginif (c[x+z[i1,1]*2,y+z[i1,2]*2]+sum>=max) thenbeginmax:=c[x+z[i1,1]*2,y+z[i1,2]*2]+sum;for k1:=1 to 4 do boo[k1]:=false;max_x:=i;max_y:=j;max_ch:=i1;end;end;end;end;///writeln(max); // 打洞后最大房间writeln(max_x,' ',max_y,' ',s[max_ch]);
end.

本人第一篇题解,若有不足,大声的说出来,只要我可以做到一定做到

这篇关于P1457 城堡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/700312

相关文章

乐城堡 JoyCastle Unity岗位笔试题

1)实现 move(GameObjct gameObject, Vector3 begin, Vector3 end, float time, bool pingpong){ } 使 gameObject 在 time 秒内,从 begin 移动到 end,若 pingpong 为 true,则在结束时 使 gameObject 在 time 秒内从 end 移动到 begin,如此往复。 2)

HDU1269 迷宫城堡 (强连通图判定)

题意:判定给出的有向图是不是强连通图 Tarjan算法模板题目 #include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue

SDUT OJ 2798小鑫的城堡 并查集

题目描述 从前有一个国王,他叫小鑫。有一天,他想建一座城堡,于是,设计师给他设计了好多简易图纸,主要是房间的连通的图纸。小鑫希望任意两个房间有且仅有一条路径可以相通。小鑫现在把设计图给你,让你帮忙判断设计图是否符合他的想法。比如下面的例子,第一个是符合条件的,但是,第二个不符合,因为从5到4有两条路径(5-3-4和5-6-4)。 输入 多组输入,每组第一行包含一个整数m(m

AW349 黑暗城堡

题目地址 易错点: 模数是2147483647. #include<cstdio>#include<iostream>#include<cstring>#include<queue>#define ll long longusing namespace std;const int MAXN=2e3,MAXM=2e6,MOD=2147483647;struct Edg

『围城』:愿我们都能走出命运的城堡

本文首发于我的个人博客:『不羁阁』 文章链接: 『传送门』 在20岁的时候读“围城”看了一小半便觉得无趣就放一边不再看了。 在23岁的时候,完整地读了一遍“围城”,也许是自己资历尚浅,尚未经历婚姻,看完竟没有那么多的感悟和震动。 也许在今后拥有婚姻之后再来读这本“围城”,我会有更多的感受吧。 我们每个人都生活在一座围城里,我们拼了命的想要逃出这座城,逃出去却发现外边是更大的一座围城

hdu(1269)迷宫城堡

题意很容易理解;; //强连通是任意两点都能到达,双向的。 #include"stdio.h" int pre[100001]; int find(int k) { if(k!=pre[k]) pre[k]=find(pre[k]); return pre[k]; } int main() { int n,m,i,a,b; while(sca

HDU 1269 迷宫城堡(强连通)

HDU 1269 迷宫城堡 题目链接 题意:中文题 思路:强连通模板题 代码: #include <cstdio>#include <cstring>#include <vector>#include <stack>using namespace std;const int N = 10005;int n, m;vector<int> g[N], scc[N];

POJ 1164 The Castle 深搜入门(城堡问题)

题意:计算城堡一共有多少房间,最大的房间有多大(多少方块数构成最大的房间)? 城堡被分割成 R × C(R <= 50,C <= 50),每个方块可以有 0-4 面墙(1-西面有墙,2-北面有墙,4-东面有墙,8-南面有墙),例如:13-表示东南西三面有墙。 深度优先遍历图 VS 广度优先遍历图 import java.io.BufferedReader;import java.io.

hdu 1269 迷宫城堡(求强连通分量)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8196    Accepted Submission(s): 3664 Problem Description 为了训练小希的方向感,Gardon建立了

城堡 The Castle

城堡 The Castle 洛谷P1457 唉 这道题不是特别难 就是要求输出太多 无奈之下写了90行 算了 今天在代码上写注释吧 #include <iostream>using namespace std;int n,m,cnt,area,marea=0,dir;int w[55][55],f[55][55]; // w记录墙 f就是flagint dx[4]={0,