洛谷 P1320 壓縮技術 (續集版)題解
阿新 • • 發佈:2020-10-22
先上題目傳送門
接下來是枯燥的題目介紹
壓縮技術 (續集版)
設某漢字由N×N的0和1的點陣圖案組成.
我們依照以下規則生成壓縮碼。連續一組數值:從漢字點陣圖案的第一行第一個符號開始計算,按書寫順序從左到右,由上至下.第一個數表示連續有幾個0,第二個數表示接下來連續有幾個1,第三個數再接下來連續有幾個0,第四個數接著連續幾個1,以此類推......
例如: 以下漢字點陣圖案:
0001000
0001000
0001111
0001000
0001000
0001000
1111111
對應的壓縮碼是:7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一個數是N,其餘各位表示交替表示0和1的個數,壓縮碼保證N×N=交替的各位數之和)
輸入輸出格式
輸入格式
漢字點陣圖(點陣符號之間不留空格).(3<=N<=200)
輸出格式
一行,壓縮碼.
輸入輸出樣例
輸入樣例 #1
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
輸出樣例 #1
0001000
0001000
0001111
0001000
0001000
0001000
1111111
emmm,接下來我說一說思路,我準備先定義一個一維的字元型別的陣列,這個數字用來存輸入的東西,接下來用無限(無限輸入就是指使用while迴圈的方式cin)輸入的方式輸入這些字元,接下來定義兩個計數變數,第一個計數變量表示連續1和0出現的個數,第二個計數變量表示這個輸入正方形的邊長.然後無限輸入,每次把第二個計數變數加一,接下來輸出第二個計數變數開方後的結果.然後再來一個迴圈,每次判斷字串中的第i個字元是否是一或者零,如果是,那麼第一個迴圈變數加一;如果不是,那麼輸出此時的第一個迴圈變數,然後把這第一個迴圈變數變成一,經過這一系列的迴圈之後,再把最後的第一個計數變數輸出就可以了(因為這個計數變數在最後的時候並沒有輸出).最後只要注意每次輸出的時候再加一個空格就行.
上程式碼!!
#include <cstdio> #include <iostream> #include <cmath> using namespace std; int main(){ char tmp[40005];//輸入的字串
int cnt1=0/*第一個計數變數*/,cnt=0;//第二個計數變數 char flag='0';//判斷是否等於是要用 while(cin>>tmp[cnt]) cnt++;//無限輸入 cout<<(int)sqrt(cnt)<<" ";//輸出正方形邊長for(int i=0;i<cnt;i++){//遍歷每個字元 if(tmp[i]==flag){//判斷是否相等 cnt1++;//如果相等則cnt1++ }else{//如果不相等 cout<<cnt1<<" ";//輸出cnt1 cnt1=1;//歸一 if(flag=='0') flag='1';//flag變換 else if(flag=='1') flag='0';//flag變換 } } cout<<cnt1;//最後補上輸出 return 0; }
謝謝大家!