演算法入門 第三章 陣列和字串 蛇形填數

2021-09-12 08:25:25 字數 1231 閱讀 8156

從現在開始準備寫乙個關於我學習《演算法競賽-入門經典》學到的一些知識點的系列部落格。

題目描述
題目描述:

給定乙個 n , 在 n * n 的方陣中填入 1 ,2, 3,……,n * n, 要求填成蛇形。

例如在 n = 5 時 , 如下所示:

13 14 15 16 1

12 23 24 17 2

11 22 25 18 3

10 21 20 19 4

9 8 7 6 5

首先構造操作環境:宣告乙個足夠大的二維陣列:a[maxn][maxm]

蛇形填數,顧名思義就是像蛇的形狀一樣對陣列進行填數,理解成從「1」依次開始。設「筆」的座標是(x,y)則一開始的座標是x=0,y=n-1即(0,n-1);「筆」的移動軌跡就是「下 下 下……左 左 左……上 上 上……右 右 右……」,就是先朝著乙個方向走,直到不能走了(這裡是有條件的),再換個方向繼續走。

不能走有兩種情況

2.1: 到達蛇形填數形成矩陣的邊界了,再繼續走就越界了(即使陣列沒越界)。舉個例子,比如題目中給定了初始數字n=5,那麼從1開始往下走,走到5就不能繼續往下寫6(如果繼續往下寫6,就不能構成乙個55的蛇形矩陣了),即使陣列宣告的是1010的陣列空間。

2.2:繼續走就要走到已經填過的格仔了;再拿本題題目中給的例子,比如從16往下走,填到19就不能繼續往下走了,往下走就是已經填過的6了。

範例**:(main函式部分)

int main(){

int n,x,y,tot=0;

scanf("%d",&n);

memset(a,0,sizeof(a));//陣列清零

tot=a[x=0][y=n-1]=1;

while(tot=0 && !a[x][y-1]) a[x][--y]=++tot;//從最後一行往右走

while(x-1>=0 && !a[x-1][y]) a[--x][y]=++tot;//從第一列往上走

while(y+1反思及總結

主要的原則是:先判斷再移動

拿內層的乙個while迴圈來說:

while(x+1拓展乙個知識點

「&&」 是短路運算子,什麼意思呢?

while(x+1因此,不用擔心當x+1訪問非法記憶體問題。

第三章陣列和字串下

一道典型的水題。include include include using namespace std int it 5 char its 5 acgt int main if it 0 max max it 1 it 2 it 3 b i its 0 else if it 1 max it 2 i...

第三章 字串

3 1 基本字串操作 字串是不可變的。類似以下的分片賦值是不合法的 website 3 com 報錯 3.2 字串格式化 在 的左側放置乙個字串,而右側放置希望格式化的值。format hello,s,s enough for ya?values world hot print format val...

第三章 陣列和字串 例題篇 演算法競賽入門經典

知識點一 蛇形填數 p40 利用邊界和碰撞 include include define max 20 int set max max int main for int i 0 i n i printf n return0 知識點二 讀取字串 p43 1.scanf s s 它會讀入乙個不含空格 t...