信息学奥赛一本通 2041:【例5.9】新矩阵
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 2041:【例5.9】新矩阵
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目鏈接】
ybt 2041:【例5.9】新矩陣
【題目考點】
1. 二維數組
2. 二維數組同一斜線上坐標規律
- 左上右下斜線橫縱坐標差值為定值
- 右上左下斜線橫縱坐標加和為定值
【解題思路】
解法1: 利用二維數組中斜線上的坐標規律
在一個n行n列的矩陣上
- 左上右下對角線,經過(1,1)位置,那么這一斜線上各位置行列坐標差值都為0。
- 右上左下對角線,經過(1,n)位置,那么這一斜線上各位置行列坐標加和為1+n
遍歷二維數組,只要滿足以上兩個條件中的其中一個,那么就是對角線上的元素,其值增加10。
解法2: 移動焦點位置,遍歷對角線。
- 首先將焦點位置設為(1,1),每次將焦點向右下方移動一次,即行列坐標各加1,每到一個位置,該位置值加10。直到將焦點移出二維數組。
- 將焦點位置設為(1,n),每次將焦點向左下方移動一次,即行坐標加1,列坐標減1。每到一個位置,該位置加10,直到將焦點移出二維數組。
- 為防止兩條對角線有重疊部分,可以先在一個各元素都為0的二維數組上面,將對角線位置的值都設為10。如果要向某位置賦值時這里已經有值,那么就不再加10。然后輸入二維數組,在已有二維數組基礎上,每個位置增加輸入的值。
【題解代碼】
解法1:利用二維數組中斜線上的坐標規律
#include<bits/stdc++.h> using namespace std; int main() {int n, a[30][30];cin >> n;for(int i = 1; i <= n; ++i)//輸入矩陣 for(int j = 1; j <= n; ++j)cin >> a[i][j];for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j){//左上右下對角線:橫縱坐標相同 右上左下對角線:橫縱坐標相加和為n+1 if(i == j || i+j == n+1)a[i][j] += 10; //對角線數字加10 }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 main() {int t, n, a[30][30] = {}, i, j;cin >> n;for(i = j = 1; i <= n && j <= n; i++, j++)//左上右下對角線a[i][j] += 10;for(i = 1, j = n; i <= n && j >= 1; i++, j--)//右上左下對角線{if(a[i][j] == 0)//防止重復賦值a[i][j] += 10;}for(int i = 1; i <= n; ++i)//輸入矩陣 for(int j = 1; j <= n; ++j){cin >> t;a[i][j] += t;}for(int i = 1; i <= n; ++i)//輸出矩陣 {for(int j = 1; j <= n; ++j)cout << a[i][j] << ' ';cout << endl;}return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通 2041:【例5.9】新矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: layer的msg函数_layer弹出信
- 下一篇: 信息学奥赛一本通 1970:【15NOI