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