蛇形矩阵[模拟]
题目描述
输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入格式
输入共一行,包含两个整数n和m。
输出格式
输出满足要求的矩阵。
矩阵占n行,每行包含m个空格隔开的整数。
数据范围
1≤n,m≤1001≤n,m≤100
输入样例:
3 3
输出样例:
1 2 3
8 9 4
7 6 5
思路分析
就像题目描述一样,先从最外边的圈圈开始填数,由外而内,将全部方格填满,最后就是答案。
- 我们将没次填数的边界定位, l , r , t o p , d o w n l,r,top, down l,r,top,down, 可以通过这些边界,来找到确定的位置,然后一直模拟
- 具体解释看java代码
AC代码
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int m = cin.nextInt();
int[][] a = new int[n][m];
int l = 0, r = m - 1, top = 0, down = n - 1; // 从最外层开始填数
int k = 1;
while (l <= r && top <= down) {
for (int i = l; i <= r; ++ i) { // 填当前层的上面一行
a[top][i] = k ++;
}
for (int i = top + 1; i <= down; ++ i) { // 填当前层右边边一列
a[i][r] = k ++;
}
for (int i = r - 1; i >= l && top < down; -- i ) { // 填当前层底部一行, top < down,是为了判断是否到达中间最后一行
a[down][i] = k ++;
}
for (int i = down - 1; i > top && l < r; -- i) { // 填当前层左边一列, l < r 判断是否左边一行不用再填,只需要填横着的一行
a[i][l] = k ++;
}
l ++; r--; top ++; down --;
}
for (int[] c : a) {
for (int x : c) {
System.out.print(x + " ");
}
System.out.println();
}
}
}
C++代码
#include <iostream>
using namespace std;
const int N = 105;
int a[N][N];
int main()
{
int n, m;
cin >> n >> m;
int k = 1;
int left = 0, right = m-1, top = 0, bottom = n-1;
while(left <= right && top <= bottom)
{
for(int i = left; i <= right; ++ i)
a[top][i] = k++;
for(int i = top + 1; i <= bottom; ++ i)
a[i][right] = k ++;
for(int i = right-1; i >= left && top < bottom; -- i)
a[bottom][i] = k ++;
for(int i = bottom - 1; i > top && left < right; -- i)
a[i][left] = k++;
left++,right--,top++,bottom--;
}
for(int i = 0; i < n; ++ i){
for(int j = 0; j < m; ++ j)
cout << a[i][j] <<" ";
cout << endl;
}
return 0;
}