AcWing 756. 蛇形矩陣
阿新 • • 發佈:2021-02-05
上一篇部落格:AcWing 1113. 紅與黑(BFS、DFS)
寫在前面:大家好!我是
AC-fun
,我的暱稱來自兩個單詞Accepted
和fun
。我是一個熱愛ACM的蒟蒻。如果部落格中有不足或者的錯誤的地方歡迎在評論區或者私信我指正,感謝大家的不吝賜教。我的唯一部落格更新地址是:https://ac-fun.blog.csdn.net/。非常感謝大家的支援。一起加油,衝鴨!
用知識改變命運,用知識成就未來!加油 (ง •̀o•́)ง (ง •̀o•́)ง
原題連結:AcWing 756. 蛇形矩陣
文章目錄
題目資訊
題目描述
輸入兩個整數 n 和 m,輸出一個 n 行 m 列的矩陣,將數字 1 到 n*m 按照回字蛇形填充至矩陣中。具體矩陣形式可參考樣例。
輸入格式
輸入共一行,包含兩個整數n和m。
輸出格式
輸出滿足要求的矩陣。
矩陣佔n行,每行包含m個空格隔開的整數。
資料範圍
1 ≤ n, m ≤ 100
輸入樣例
3 3
輸出樣例
1 2 3
8 9 4
7 6 5
題解
解題思路
本題主要是考察了陣列,我們可以使用兩種方法解決本題目。第一種方法是使用 while迴圈
,第二種方法是使用 for迴圈
while迴圈思路
首先設定初始座標為 (0, 0)
,然後將結果二維陣列 q[N][N]
的第一個元素設定為 1
,計數器 cnt
的初始值為 1
。使用while迴圈來進行填數,只要 cnt < n * m
就進行填數。使用四條 while 迴圈來依次填4個方向的數字,先判斷下一個要填的位置是否出界,如果沒有出界在判斷該位置的數字是否已經填過數字了,如果沒有填過則將 ++cnt
賦值給下一個陣列元素。直到填完整個陣列。
解題程式碼
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int q[N][N];
int main() {
int n, m;
cin >> n >> m;
int cnt = 1;
int x = 0, y = 0;
q[x][y] = 1;
while (cnt < n * m) {
while (y + 1 < m && !q[x][y + 1]) q[x][++y] = ++cnt;
while (x + 1 < n && !q[x + 1][y]) q[++x][y] = ++cnt;
while (y > 0 && !q[x][y - 1]) q[x][--y] = ++cnt;
while (x > 0 && !q[x - 1][y]) q[--x][y] = ++cnt;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << q[i][j] << " ";
}
cout << endl;
}
return 0;
}
for迴圈思路
一直向一個方向填數,如果 下一個位置出界
或者 已經被填過數了
,那麼就改變方向繼續進行填數。
解題程式碼
#include<iostream>
using namespace std;
const int N = 110;
int m, n;
int q[N][N];
bool inmap(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m;
}
int main() {
cin >> n >> m;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int x = 0, y = 0, d = 1;
for (int i = 1; i <= n * m; i++) {
q[x][y] = i;
int x1 = x + dx[d], y1 = y + dy[d];
// 如果出界或者下一個已經被填過了,那麼就改變方向並更新座標
if (!inmap(x1, y1) || q[x1][y1]) {
d = (d + 1) % 4;
x1 = x + dx[d];
y1 = y + dy[d];
}
x = x1, y = y1;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << q[i][j] << ' ';
}
cout << endl;
}
return 0;
}
未完待續,持續更新中……