编写一个程序,将1~n2按行依次填入n×n的矩阵,执行若干条行或者列的循环移动的指令,再将数字按行依次取出。
指令如下:
指令 含义 L x y x行循环左移y次 R x y x行循环右移y次 U x y x列循环上移y次 D x y x列循环下移y次 输入
第一行是一个整数K,表示样例的个数。 每个样例的第一行是两个整数n(1≤n≤10)和m(1≤m≤1000),分别表示矩阵的大小和指令的条数。
以后的m行是m条指令,矩阵的行列按1开始计数,指令满足1≤x≤n,1≤y≤n−1。输出
每行输出一个样例的结果,数字之间用一个空格隔开,行末无空格。
样例输入
4 3 1 L 1 1 3 1 R 1 1 3 1 U 1 1 3 1 D 1 1样例输出
2 3 1 4 5 6 7 8 9 3 1 2 4 5 6 7 8 9 4 2 3 7 5 6 1 8 9 7 2 3 1 5 6 4 8 9
解题思路: 纯模拟,按照题目意思来,关键是要细心,以及考虑到变化关系。
AC代码:
#include <stdio.h>int matrix[15][15];
int n,m,x,y;
char operate;void juzhen() // 矩阵输入
{int a = 0;for (int i = 1; i <= n; i ++)for (int j = 1; j <= n; j ++)matrix[i][j] = (++ a);
}void weiyi(char operate,int x,int y)
{if (operate == 'L'){while ( y --){int b = matrix[x][1];for (int i = 1; i < n; i ++)matrix[x][i] = matrix[x][i+1];matrix[x][n] = b;}}if (operate == 'R'){while ( y --){int b = matrix[x][n];for (int i = n; i > 1; i --)matrix[x][i] = matrix[x][i-1];matrix[x][1] = b; }}if (operate == 'U'){while ( y --){int b = matrix[1][x];for (int i = 1; i < n; i ++)matrix[i][x] = matrix[i+1][x];matrix[n][x] = b;}}if (operate == 'D'){while ( y --){int b = matrix[n][x];for (int i = n; i > 1; i --)matrix[i][x] = matrix[i-1][x];matrix[1][x] = b;}}
}int main()
{int K;scanf("%d",&K);while ( K --){scanf("%d",&n);juzhen();scanf("%d",&m);while ( m --){getchar();scanf("%c %d %d",&operate,&x,&y);weiyi(operate,x,y);}for (int i = 1; i <= n; i ++) // 输出{for (int j = 1; j <= n; j ++){printf("%d",matrix[i][j]);if ( !(i == n && j == n))printf(" ");}}puts("");}return 0;
}