1. 程式人生 > >題解:琪露諾的冰雪小屋luogu3693

題解:琪露諾的冰雪小屋luogu3693

慶祝通過noip2018初賽,系列五題EP1.

題目描述:

 

https://www.luogu.org/problemnew/show/P3693

除錯記錄:  真的很爽

下面是程式碼:

目前寫過的最長的程式碼

  1#include<bits/stdc++.h>
2#define N 21 
3#define map ___map
4using namespace std;
5int n,m,cnt_block,R,C,D,S,HR,HC,HX,HY,HM,H,not_outside,maxhigh,ret1,ret2;
6
int map[N][N][N],is_ice[N][N][N],temp[N][N];
7bool skip,vis[N][N][N],bo,un,last,wall,unt;
8const int dic[8][2]={{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1}};
9const int dir[6][3]={{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};
10string ch;
11struct node{int x,y,z;};
12
bool inside(int x,int y,int z){
13    if (x<0||x>=n||y<0||y>=n||z<0||z>HM) 
14        return false;
15    return true;
16}
17int remove_fall(int xxx,int yyy,int
 zzz)
{
18    if (map[xxx][yyy][zzz]==0return 0;
19    memset(vis,false,sizeof(vis)); 
20    queue<node> Q;
21    Q.push({xxx,yyy,zzz}); vis[xxx][yyy][zzz]=true;
22    bo=falseint res=0;
23    while (!Q.empty()){
24        node ver=Q.front(); Q.pop();
25        if (ver.z==0){ bo=true;break;}
26        for (int i=0;i<6;i++){
27            int xx=ver.x+dir[i][0],yy=ver.y+dir[i][1],zz=ver.z+dir[i][2];
28            if (inside(xx,yy,zz))
29                if (!vis[xx][yy][zz] && map[xx][yy][zz]==2){
30                    vis[xx][yy][zz]=true;
31                    Q.push({xx,yy,zz});
32                }
33        }
34    } 
35    if (!bo)
36        for (int i=0;i<n;i++)
37            for (int j=0;j<n;j++)
38                for (int k=0;k<HM;k++)
39                    if (vis[i][j][k]) res++,map[i][j][k]=0;
40    return res;
41}
42void read(){
43    cin >> n;
44    cin >> HM;
45    cin >> HR >> HC >> HX >> HY;
46    cin >> m;
47    memset(temp,0,sizeof(temp));
48    memset(map,0,sizeof(map)); 
49
50int solve_ICE_BARRAGE(int R,int C,int D,int S){
51    int r=R,c=C;
52    int res=0;
53    for (int i=0;i<=S;i++){
54        if (map[r][c][0]==2||r<0||c<0||r>=n||c>=n) return res;
55        if (temp[r][c]<4)
56            res++,temp[r][c]++;
57        r+=dic[D][0]; c+=dic[D][1];
58    }
59    return res;
60}
61int solve_MAKE_ICE_BLOCK(){
62    int res=0;
63    for (int i=0;i<n;i++)
64        for (int j=0;j<n;j++)
65            if (temp[i][j]>=4){
66                res++; temp[i][j]-=4;
67                cnt_block++;
68            }
69    return res;
70}
71int solve_PUT_ICE_BLOCK(int R,int C,int H){
72    if (cnt_block==0){
73        skip=falseprintf("CIRNO HAS NO ICE_BLOCK\n");
74        return 0;
75    }
76    if (H!=0)
77        if (map[R+1][C][H]!=2&&map[R-1][C][H]!=2&&map[R][C+1][H]!=2&&map[R][C-1][H]!=2&&map[R][C][H+1]!=2&&map[R][C][H-1]!=2){
78            skip=false;printf("BAKA CIRNO,CAN'T PUT HERE\n");
79            return 0;
80        }
81    if (map[R][C][H]==2){
82        skip=false;printf("BAKA CIRNO,CAN'T PUT HERE\n");
83        return 0;
84    }
85    map[R][C][H]=2;
86    cnt_block--;
87    if (H==0) temp[R][C]=0;
88    if (R<HR||R>HR+HX-1||C<HC||C>HC+HY-1){
89        skip=falseprintf("CIRNO MISSED THE PLACE\n");
90        return 0;
91    }
92    if (R>=HR+1&&R<=HR+HX-2&&C>=HC+1&&C<=HC+HY-2){
93        skip=falseprintf("CIRNO PUT AN ICE_BLOCK INSIDE THE HOUSE\n");
94        return 0;
95    }
96    return cnt_block;
97}
98
99int solve_REMOVE_ICE_BLOCK(int R,int C,int H){
100    if (map[R][C][H]!=2){
101        skip=falseprintf("BAKA CIRNO,THERE IS NO ICE_BLOCK\n");
102        return -1;
103    }
104    map[R][C][H]=0; cnt_block++;
105    int rs=0;
106    for (int i=0;i<6;i++)
107        if (inside(R+dir[i][0],C+dir[i][1],H+dir[i][2]))
108            rs+=remove_fall(R+dir[i][0],C+dir[i][1],H+dir[i][2]);
109    return rs;
110}
111void solve_MAKE_ROOF(){
112    int res=0,size=0;;
113    maxhigh=0;
114    for (int i=HR;i<HX+HR;i++)
115        for (int j=HC;j<HY+HC;j++)
116            for (int k=0;k<HM;k++){
117                if(map[i][j][k]==2 && (i==HX+HR-1||j==HY+HC-1||i==HR||j==HC))

相關推薦

題解冰雪小屋luogu3693

慶祝通過noip2018初賽,系列五題EP1. 題目描述:   https://www.luogu.org/problemnew/show/P3693 除錯記錄:  真的很爽 下面是程式碼: 目前寫過的最長的程式碼 1#include<bits/stdc++.

[洛谷P3693]冰雪小屋

題目大意:琪露諾的冰雪小屋,我做的第一道大模擬題。 題解:模擬。。。 卡點:無數小錯誤,要是沒有寫一點調一點,那大概是永遠調不出來了。。。   C++ Code: #include <cstdio> #include <cstring> #include

P1725 題解(單調佇列)

題目連結 琪露諾 解題思路 單調佇列優化的\(dp\)。 狀態轉移方程:\(f[i]=max{f[i-l],f[i-l+1],...,f[i-r-1],f[i-r]}+a[i]\) 考慮單調佇列優化。 因為剛學,不是很熟悉單調佇列,特寫一篇詳細的解釋。 \(queue\) 陣列儲存一個佇列,他的頭部和尾

luogu P1725

void etc href target pan .... class while [] 二次聯通門 : luogu P1725 琪露諾 /* luogu P1725 琪露諾 DP + 線段樹 用線段樹維護dp[i -

codevs 3943 數學奇才

main 。。 rcu argc == res target include () 二次聯通門 : codevs 3943 數學奇才琪露諾 /* codevs 3943 數學奇才琪露諾 一眼看過去 感覺這道題是個神題。。。

amp algo [1] string for cstring line ios pri 傳送門啦 本人第一個單調隊列優化 $ dp $,不鼓勵鼓勵? 琪露諾這個題,$ dp $ 還是挺好想的對不,但是暴力 $ dp $ 的話會 $ TLE $ ,所以我們考慮用單調隊列優化

(洛谷P1725)(簡單滑窗優化Dp)

文章目錄題目題目大意:資料範圍思路程式碼 題目 非常廢話 傳送門 題目大意: 給你一個長度為n+1的格子,編號為[0,n],你在0,現在你要從0跳過n,每次你能跳到下一個格子的區間為[i+L,i+R],

單調佇列+dp +NOIP 2017 跳房子

一、琪露諾: 題意:一開始在000號格子上,每個格子有一個權值,在格子iii時,下一次可以移動到區間[i+l,i+r][i+l,i+r][i+l,i+r]中的任意一格,只要下一步的位置編號大於nnn就算

【DP、線段樹優化】

跟去年(2017)PJ第四題幾乎是一樣的?/吐血 DP方程可以很簡單的推出來,f[i]=max{f[k]}+a[i] 然而這樣做是O(n^2)的 看一下資料,200000的話要不nlogn 要不n 由於題解裡面單調佇列和優先佇列都有人用了,那就來一發線段樹吧 (或者實情是:單調佇列不會打?) 只要維護i-r~

洛谷 P1725

print href || get new n) num 復雜 namespace 傳送門:洛谷 P1725 琪露諾 算法分析: 設 \(dp[i]\) 為走到i位置的最大價值,則 \(dp[i]=max(dp[i],dp[i-j]+a[i])\) , 其中\(i\in[l

2013-BIT程式設計 9.的完美算數教室——⑨的統計I -- 高精度

眾所周知,琪露諾(チルノ,Cirno)是幻想郷 (げんそうきょう)中首屈一指的天才,可以說⑨就是她的代名詞。 然而如今,她遇到了一個和⑨有關的難題。你能幫助她麼? 題目是這樣的,給出兩個數 a 和 b (0 <= a <= b <= 10^10000),求 a 到 b 之間(包括a和b)的

題解報告hdu1995漢塔V

pre clas gpo style bit body turn 規律 class 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 解題思路:求第k號盤子至少需要移動的次數,實際上是求n-k(認作是前g-1個盤子移動的

題解報告hdu1996漢塔VI

http blog clu AC 鏈接 using 選擇 acm c++ 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1996 解題思路:每個盤子有3種選擇,故系列總數為3^n。(水題!!!) AC代碼: 1 #incl

Gym 100733J Summer Wars 題解靈活運用掃描線的思想

ace ng- 最大值 掃描線 例如 main post 集合 i++ 題意: 給你n個點,m個橫著的線段。你能夠橫移這些線段,可是這些線段的相對位置不能改變。假設一個點,在它的正上方和和正下方都有線段(包含線段的終點)。則這個點被視為被“屏蔽”。問通過隨意平移我們

題解bzoj1801: [Ahoi2009]chess 中國象棋

bits 題解 display num 兩個 lld ber 組合 i++ Description 在N行M列的棋盤上,放若幹個炮可以是0個,使得沒有任何一個炮可以攻擊另一個炮。 請問有多少種放置方法,中國像棋中炮的行走方式大家應該很清楚吧. Input 一行包含兩個整數N

題解UVa1025 A Spy in the Metro

cit %d mat png a10 direct 發現 TP 最小 原題鏈接 pdf 題目大意 給出一張無向圖圖,求該圖的最小瓶頸生成樹。 無向圖的瓶頸生成樹:無向圖\(G\)的一顆瓶頸生成樹是這樣的一顆生成樹:它最大的邊權值在\(G\)的所有生成樹中是最小的。瓶頸生成樹

題解中位數

www. 單調遞增 pro namespace target space IT UC 基於 傳送門 首先考慮的是二叉搜索樹,每次查找當前排名(i+1)/2的數。但是對於某些數據,其遞歸層數過多,會導致爆棧。 那麽顯然可以用Treap或Splay。 這裏考慮線段樹

題解[ZJOI2014]璀燦光華

找到 距離 坐標 回溯 turn 編號 最短路 ges 方法 原題鏈接 題目描述 金先生有一個女朋友沒名字。她勤勞勇敢、智慧善良。金先生很喜歡她。為此,金先生用\(a^3\)塊\(1 \times 1 \times 1\)的獨特的水晶制作了一個邊長為\(a\)的水晶立方體,

題解HNOI2002 營業額統計

工作 flow keyword nbsp 管理 soft min pad nco 題目描述 Tiger最近被公司升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。 Tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營

題解CF115E(線段樹優化dp)

定義 可能 bit tput space nbsp sans odi bsp 題目描述 你是一個賽車比賽的組織者,想在線性王國中安排一些比賽。 線性王國有n條連續的從左到右的道路。道路從左到右依次編號為從1到n,因此道路按照升序排列。在這些道路上可能會有幾場比賽,每一場