方阵循环右移
題目
練習7-8 方陣循環右移 (20 分)
本題要求編寫程序,將給定n×n方陣中的每個元素循環向右移m個位置,即將第0、1、?、n?1列變換為第n?m、n?m+1、?、n?1、0、1、?、n?m?1列。
輸入格式:
輸入第一行給出兩個正整數m和n(1≤n≤6)。接下來一共n行,每行n個整數,表示一個n階的方陣。
輸出格式:
按照輸入格式輸出移動后的方陣:即輸出n行,每行n個整數,每個整數后輸出一個空格。
輸入樣例:
2 3
1 2 3
4 5 6
7 8 9
輸出樣例:
2 3 1
5 6 4
8 9 7
分析
本體循環右移,類似一個環,右移長度超過環的長度,將從環尾移到環頭。右移長度超過環的長度,列標從j變成p=(j+m)%n。右移長度小于等于環的長度,列標j變成j+m。注意等于的時候也是j+m。
一開始考慮直接對這個數組進行處理,逐列判斷,兩兩交換初始的數據和右移后的數據,但是后來發現兩兩交換時,可能不需要進行到最后一列,就已經全部右移完畢,此時如果再交換,會導致將正確的位置打亂。
所以增加了一個數組,用來表示交換后的數組b。將原數組a[i][j]下標中的元素放到b數組里合適的位置。
代碼
#include<stdio.h>int main(){int m,n,i,j,a[9][9],k,p,b[9][9];//a存初始數組,b是右移后的數組scanf("%d %d",&m,&n);if(m>n) m=m%n;//移動的距離m如果大于數組列數n,需要對m處理for(i=0;i<9;++i){//數組初始化for(j=0;j<9;++j){a[i][j]=0;b[i][j]=0;}}for(i=1;i<=n;++i){for(j=1;j<=n;++j){scanf("%d",&a[i][j]);}}for(i=1;i<=n;++i){for(j=1;j<=n;++j){if(j+m>n) {//如果移動的距離超過了數組的大小,進行取余p=(j+m)%n;}else p=j+m;//移動的距離小于等于數組的大小b[i][p]=a[i][j];}}for(i=1;i<=n;++i){for(j=1;j<=n;++j){printf("%d ",b[i][j]);}printf("\n");} }總結
- 上一篇: java pc端软件抓包,如何通过抓包工
- 下一篇: stm32 PWM输入捕获