编写一个程序,将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代码:
cpp
#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;
}