OpenJudge NOI 1.8 24:蛇形填充数组
生活随笔
收集整理的這篇文章主要介紹了
OpenJudge NOI 1.8 24:蛇形填充数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
OpenJudge NOI 1.8 24:蛇形填充數組
【題目考點】
1. 二維數組
【解題思路】
解法1:移動焦點
設焦點位置,焦點移動同時為焦點位置賦值。焦點移動規則為:
- 移動到右上角時,行加1
- 移動到左下角時,列加1
- 移動到第一行或第n行時,列加1
- 移動到第一列或第n列時,行加1
不斷移動焦點,填充整個矩陣,最后輸出矩陣。
解法2:遍歷矩陣
下標從1開始,每條右上左下斜線上的位置的行列坐標加和是一定的,第一條斜線的加和為2,第二條為3,。。。,最后一條即第2n-1條斜線加和為2n。每次遍歷整個矩陣,為一條斜線賦值。
觀察規律可知:
- 斜線編號為奇數的斜線,數字是從左下向右上填充的,行減少列增加。
- 斜線編號為偶數的斜線,數字是從右上向左下填充的,行增加列減少。
每次填充一條斜線,填充整個矩陣,最后輸出矩陣。
【題解代碼】
解法1:移動焦點
#include<bits/stdc++.h> using namespace std; int dir[2][2]={{-1,1},{1,-1}};//兩種方向:右上、左下 int a[15][15]; int main() {int k = 1, n, i, j, d = 0, si, sj;//(si,sj):擬定的下一個位置 cin >> n;i = j = 1;while(k <= n*n){a[i][j] = k++;si = i + dir[d][0], sj = j + dir[d][1];if(si < 1 || si > n || sj < 1 || sj > n)//如果下一個位置移出了邊界 { d = (d+1)%2;//改變移動方向 if(i == 1 && j == n)//如果是右上角,則到下一行 i++;else if(i == n && j == 1)//如果是在左下角,則到下一列 j++;else if(i == 1 || i == n)//如果在第一行或最后一行,到下一列 j++;else if(j == 1 || j == n)//如果在第一列或最后一列,到下一行 i++;}elsei += dir[d][0], j += dir[d][1];}for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j)cout << a[i][j] << ' ';cout << endl;}return 0; }解法2:遍歷矩陣
#include <bits/stdc++.h> using namespace std; int a[15][15]; int main(){int n, k = 1;cin >> n;for(int m = 1; m <= 2*n-1; m++)//m為斜線編號,即每條斜線的行列坐標加和減1 {if(m%2 == 0)//斜線編號為偶數的斜線,數字是從右上向左下填充的,行增加列減少。{for(int i = 1; i <= n; i++)for(int j = n; j >= 1; j--)if(i + j == m + 1)//第m條斜線的行列坐標加和為m+1 a[i][j] = k++;}else//斜線編號為奇數的斜線,數字是從左下向右上填充的,行減少列增加。{for(int i = n; i >= 1; --i)for(int j = 1; j <= n; ++j)if(i + j == m + 1)a[i][j] = k++; }}for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)cout << a[i][j] << ' ';cout << endl;}return 0; }總結
以上是生活随笔為你收集整理的OpenJudge NOI 1.8 24:蛇形填充数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言显示相位的程序,【图片】求助大佬用
- 下一篇: 信息学奥赛一本通 1154:亲和数