2020-04-13

編程筆記|藍橋杯模擬賽收獲(8題)

本文非原創(chuàng)串结,僅為個人的學習筆記
下面附上參考網址:
C++ cin.get用法(詳解版)
C++ : cin.get()函數和cin函數的使用
c++中隊列函數queue的常用

第八題

【問題描述】

小明有一塊空地,他將這塊空地劃分為 n 行 m 列的小塊苇本,每行和每列的長度都為 1贡茅。
小明選了其中的一些小塊空地骂束,種上了草咪奖,其他小塊仍然保持是空地。
這些草長得很快治筒,每個月屉栓,草都會向外長出一些,如果一個小塊種了草耸袜,則它將向自己的上友多、下、左堤框、右四小塊空地擴展域滥,這四小塊空地都將變?yōu)橛胁莸男K。
請告訴小明蜈抓,k 個月后空地上哪些地方有草启绰。

代碼:

#include <iostream>
#include <queue>

//偽代碼原來是加在using namespace 上面。
#define loop(i, x, y) for(register int i = x;i <= y;i++)
using namespace std;

//草地上的一塊
struct block {
    int i;
    int j;
    int month;
};//i沟使、j記錄行列數委可,month記錄第幾個月長的。
//這個是加到隊列里的一個元素腊嗡。

//這個是構造一個上下左右的坐標着倾,不需要寫那么多代碼
//用const相比不用節(jié)省變量儲存空間
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
//全局變量?
int vis[1000][1000]{};
int N, M, K;

int main() {
//。燕少。競賽專用讀寫加速代碼卡者。。
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    //freopen("in", "r", stdin);
    //freopen("out", "w", stdout);
//這個是用來計時的參數^_^棺亭?
    int a = clock();
    cin >> N >> M;
//建立隊列的語句虎眨?
    queue<block> q;
//讀換行符
    char next_char;
    cin.get(next_char);//cin.get與cin>>的區(qū)別蟋软?
    while (next_char != '\n')cin.get(next_char);

    loop(i, 0, N - 1) {
        loop(j, 0, M - 1) {
            cin.get(next_char);
            if (next_char == 'g') {
                q.push({i, j, 0});
                vis[i][j] = 1;
            }
        }
        cin.get(next_char);
        while (next_char != '\n')cin.get(next_char);
    }
    cin >> K;

    while (!q.empty()) {
        block b = q.front();
        q.pop();
        int month = b.month;
        if (month < K) {
            loop(i, 0, 3) {
                int nx = b.i + dx[i];
                int ny = b.j + dy[i];
                if (0 <= nx && nx < N && 0 <= ny && ny < M && vis[nx][ny] == 0) {
                    vis[nx][ny] = 1;
                    q.push({nx, ny, month + 1});
                }
            }
        }
    }
    loop(i, 0, N - 1) {
        loop(j, 0, M - 1) {
            if (vis[i][j] == 1) cout << 'g';
            else cout << '.';
        }
        cout << endl;
    }
    clog << clock() - a << endl;
    return 0;
}

知識點:

1.隊列
包含在頭文件<queue>中
隊列的定義:

queue<block> q;

<>中是類型名镶摘,這里的block是自定義結構體嗽桩。
關于queue的函數:

  • push()
    隊列中由于是先進先出,push即在隊尾插入一個元素凄敢,如:
queue<string> q;
q.push("Hello World!");
//----------//
struct block {
    int i;
    int j;
    int month;
};
queue<block> q;
q.push({i, j, 0});
  • pop()
    將隊列中最靠前位置的元素彈出碌冶,是沒有返回值的void函數。如:
q.pop();//此題中將隊列中的元素長完草就把他拿掉涝缝。
  • size()
    返回隊列中元素的個數扑庞,返回值類型為unsigned int。如:
queue<string> q;
cout<<q.size()<<endl;
q.push("Hello World!");
q.push("China");
cout<<q.size()<<endl;

輸出分別為0 和 2.

  • empty()
    判斷隊列是否為空的拒逮,如果為空則返回true罐氨。
    此題中使用dfs,語句while(!q.empty()){}是如果不為空就繼續(xù)進行長草滩援。
  • front()
    返回值為隊列中的第一個元素栅隐,也就是最早、最先進入隊列的元素玩徊。
    此題中block b=q.front();是將頭元素先拿出來長草租悄,hhh。
  • back()
    返回隊列中最后一個元素恩袱,也就是最晚進去的元素泣棋。

2.三行加速代碼

  ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

3.cin系列

  • cin
    1.cin的最常用的用法是輸入一個數字
#include <iostream> 
using namespace std; 
main () 
{ 
int a,b;
cin>>a>>b
cout<<a+b<<endl; 
}

注意:>> 是會過濾掉不可見字符(如 空格 回車,TAB 等)
你在上面輸入32(空格)2(回車)和輸入32(回車)2(回車)的結果都是34
cin>>noskipws>>input[j];//不想略過空白字符畔塔,那就使用 noskipws 流控制
2.接受一個字符串潭辈,遇“空格”、“TAB”澈吨、“回車”都結束把敢。

#include <iostream> 
using namespace std; 
main () 
{ 
char a[20]; 
cin>>a; 
cout<<a<<endl; 
}

輸入:jkljkljkl
輸出:jkljkljkl

輸入:jkljkl jkljkl //遇空格結束
輸出:jkljkl

  • cin.get()
    讀入一個字符,相當于C中的getchar()
#include <iostream> 
using namespace std; 
main () 
{ 
char ch; 
ch=cin.get();               //或者cin.get(ch); 
cout<<ch<<endl; 
}

4.clock()
clock()函數存在于頭文件<ctime>里棚辽,
clock()是返回int類型數值的系統(tǒng)時間技竟,
利用開始與結束時的時間差可以計算程序運行時間(單位:ms)。

分析:

首先為什么要多幾行代碼讀入換行符:
結合cin的用法屈藐,這里用cin>>達不到我們想要的效果榔组。
例如,因為它會忽略掉所有前導白色空格联逻,所以使用 cin>> 就不可能僅輸入一個空格或回車符搓扯。除非用戶輸入了空格鍵、制表符之外的其他字符包归,否則程序將不可能通過 cin 語句繼續(xù)執(zhí)行(一旦輸入了這樣的字符锨推,在程序可以繼續(xù)下一個語句之前,仍然需要按回車鍵)。因此换可,要求用戶“按回車鍵繼續(xù)”的程序椎椰,不能使用 >> 運算符只讀取按回車鍵的行為。
拿這個題舉例子沾鳄。
加入要求的輸入格式是在輸入MN后還要額外加個回車慨飘,那么這一行代碼(如圖),就有他的用,但我嘗試注釋了最后一行while译荞,結果還是沒變瓤的,所以我覺得之前吃掉換行符沒必要。


吃換行符代碼

我發(fā)現這道題里這兩句都注釋掉結果還是一樣吞歼。不過還是學到了圈膏。


吃換行符代碼

此處的技巧還有

#define loop(i, x, y) for(register int i = x;i <= y;i++)
//....//
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};

然后在之后的代碼里調用dx[i]、dy[i],tql我即便現在每句話都看得懂篙骡,也要能寫出來才好稽坤。我急需即學即用的能力∫皆觯看別人的代碼慎皱,一個個理解真的不耗什么腦力,要自己想出來才最厲害叶骨,這需要許多邏輯思維茫多,比如這里的while()和if()括弧里的東西要想出來還是要花點心的。

while (!q.empty()) {
        block b = q.front();
        q.pop();
        int month = b.month;
        if (month < K) {
            loop(i, 0, 3) {
                int nx = b.i + dx[i];
                int ny = b.j + dy[i];
                if (0 <= nx && nx < N && 0 <= ny && ny < M && vis[nx][ny] == 0) {
                    vis[nx][ny] = 1;
                    q.push({nx, ny, month + 1});
                }
            }
        }
    }

另外dfs的算法也值得學習忽刽,直接將每個點標記诱贿,還標記月份范删,當第一次將矩陣讀入隊列,就和矩陣無關了之后的長草都無需訪問矩陣這么大的一個儲存空間。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末厦坛,一起剝皮案震驚了整個濱河市剪决,隨后出現的幾起案子揭措,更是在濱河造成了極大的恐慌胆数,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黎泣,死亡現場離奇詭異恕刘,居然都是意外死亡,警方通過查閱死者的電腦和手機抒倚,發(fā)現死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門褐着,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人托呕,你說我怎么就攤上這事含蓉∑盗玻” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵馅扣,是天一觀的道長斟赚。 經常有香客問我,道長岂嗓,這世上最難降的妖魔是什么汁展? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任鹊碍,我火速辦了婚禮厌殉,結果婚禮上,老公的妹妹穿的比我還像新娘侈咕。我一直安慰自己公罕,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布耀销。 她就那樣靜靜地躺著楼眷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熊尉。 梳的紋絲不亂的頭發(fā)上罐柳,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音狰住,去河邊找鬼张吉。 笑死,一個胖子當著我的面吹牛催植,可吹牛的內容都是我干的肮蛹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼创南,長吁一口氣:“原來是場噩夢啊……” “哼伦忠!你這毒婦竟也來了?” 一聲冷哼從身側響起稿辙,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤昆码,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邻储,有當地人在樹林里發(fā)現了一具尸體赋咽,經...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年芥备,在試婚紗的時候發(fā)現自己被綠了冬耿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡萌壳,死狀恐怖亦镶,靈堂內的尸體忽然破棺而出日月,到底是詐尸還是另有隱情,我是刑警寧澤缤骨,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布爱咬,位于F島的核電站,受9級特大地震影響绊起,放射性物質發(fā)生泄漏精拟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一虱歪、第九天 我趴在偏房一處隱蔽的房頂上張望蜂绎。 院中可真熱鬧,春花似錦笋鄙、人聲如沸师枣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽践美。三九已至,卻和暖如春找岖,著一層夾襖步出監(jiān)牢的瞬間陨倡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工许布, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兴革,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓爹脾,卻偏偏與公主長得像帖旨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灵妨,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內容