输入包含多行,第一行两个整数n和m,代表矩阵的行数和列数,接下来n行,每行m个整数,代表矩阵matrix
。
输出包含一行,n*m个整数,代表顺时针转圈输出的矩阵matrix。
4 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
额外空间复杂度O(1)
#include<iostream>
#include<vector>
using namespace std;
void printArray(vector<vector<int>>& arr, int row1, int col1, int row2, int col2)
{
if (row1 == row2)
while (col1 <= col2) cout << arr[row1][col1++] << " ";
else if (col1 == col2)
while (row1 <= row2) cout << arr[row1++][col1] << " ";
else
{
for (int j=col1; j<col2; j++) cout << arr[row1][j] << " ";
for (int i=row1; i<row2; i++) cout << arr[i][col2] << " ";
for (int j=col2; j>col1; j--) cout << arr[row2][j] << " ";
for (int i=row2; i>row1; i--) cout << arr[i][col1] << " ";
}
}
int main()
{
int n, m;
cin >> n >> m;
vector<vector<int>> arr(n, vector<int>(m,0));
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
cin >> arr[i][j];
int row1 = 0, col1 = 0;
int row2 = n-1, col2 = m-1;
while (row1 <= row2 && col1 <= col2)
printArray(arr, row1++, col1++, row2--, col2--);
return 0;
} #include<bits/stdc++.h>
using namespace std;
vector<vector<int>> read_matrix() {
int m, n;
cin >> m >> n;
auto matrix = vector<vector<int>>(m, vector<int>(n));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
return matrix;
}
void print_edge(const vector<vector<int>>& matrix, int leftup_row, int leftup_col, int rightdown_row, int rightdown_col);
void spiral_print_matrix(const vector<vector<int>>& matrix) {
if (matrix.empty()) return;
int m = matrix.size();
int n = matrix[0].size();
int leftup_row = 0, leftup_col = 0;
int rightdown_row = m - 1, rightdown_col = n - 1;
while (leftup_row <= rightdown_row && leftup_col <= rightdown_col) {
print_edge(matrix, leftup_row++, leftup_col++, rightdown_row--, rightdown_col--);
}
}
void print_edge(const vector<vector<int>>& matrix, int leftup_row, int leftup_col, int rightdown_row, int rightdown_col) {
//只有一行
if (leftup_row == rightdown_row) {
for (int j = leftup_col; j <= rightdown_col; j++) {
cout << matrix[leftup_row][j] << " ";
}
}
//只有一列
else if (leftup_col == rightdown_col) {
for (int i = leftup_row; i <= rightdown_row; i++) {
cout << matrix[i][leftup_col] << " ";
}
} else {
int i = leftup_row, j = leftup_col;
while (j < rightdown_col) {
cout << matrix[leftup_row][j] << " ";
j++;
}
while (i < rightdown_row) {
cout << matrix[i][rightdown_col] << " ";
i++;
}
while (j > leftup_col) {
cout << matrix[rightdown_row][j] << " ";
j--;
}
while (i > leftup_row) {
cout << matrix[i][leftup_col] << " ";
i--;
}
}
}
int main() {
spiral_print_matrix(read_matrix());
} #include<iostream>
#include<vector>
using namespace std;
// 打印左上角和右下角定位出来的框
void printEdge(vector<vector<int>>& arr, int leftTopX, int leftTopY, int rightBottomX, int rightBottomY) {
if(leftTopX == rightBottomX){ // 此时只有一行
for(int i = leftTopY; i <= rightBottomY; i++) cout << arr[leftTopX][i] << " ";
}else if(leftTopY == rightBottomY){ // 此时只有一列
for(int i = leftTopX; i <= rightBottomX; i++) cout << arr[i][leftTopY] << " ";
}else{ // 常规情况,转圈打印
for(int i = leftTopY; i < rightBottomY; i++) cout << arr[leftTopX][i] << " ";
for(int i = leftTopX; i < rightBottomX; i++) cout << arr[i][rightBottomY] << " ";
for(int i = rightBottomY; i > leftTopY; i--) cout << arr[rightBottomX][i] << " ";
for(int i = rightBottomX; i > leftTopX; i--) cout << arr[i][leftTopX] << " ";
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> arr(n, vector<int>(m, 0));
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++) cin >> arr[i][j];
int leftTopX = 0, leftTopY = 0; // 左上角
int rightBottomX = n - 1, rightBottomY = m - 1; // 右下角
while(leftTopX <= rightBottomX && leftTopY <= rightBottomY)
printEdge(arr, leftTopX++, leftTopY++, rightBottomX--, rightBottomY--);
return 0;
} import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] params = br.readLine().trim().split(" ");
int m = Integer.parseInt(params[0]), n = Integer.parseInt(params[1]);
String[][] matrix = new String[m][n];
for(int i = 0; i < m; i++){
String[] row = br.readLine().trim().split(" ");
for(int j = 0; j < n; j++)
matrix[i][j] = row[j];
}
int top = 0, bottom = m - 1, left = 0, right = n - 1;
int start = 0;
while(start < m*n){
for(int i = left; i <= right; i++){
start ++;
System.out.print(matrix[top][i] + " ");
}
top ++;
if(top > bottom) continue;
for(int i = top; i <= bottom; i++) {
start ++;
System.out.print(matrix[i][right] + " ");
}
right --;
if(right < left) continue;
for(int i = right; i >= left; i--){
start ++;
System.out.print(matrix[bottom][i] + " ");
}
bottom --;
if(top > bottom) continue;
for(int i = bottom; i >= top; i--) {
start ++;
System.out.print(matrix[i][left] + " ");
}
left ++;
if(right < left) continue;
}
}
} #include <bits/stdc++.h>
using namespace std;
int main(){
int n, m, k=0;
scanf("%d%d", &n, &m);
int a[n][m], l=0, r=m-1, u=0, b=n-1;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d", &a[i][j]);
while(k<n*m){
for(int j=l;j<=r && k<n*m;j++){
printf("%d ", a[u][j]);
k++;
}
u++;
for(int i=u;i<=b && k<n*m;i++){
printf("%d ", a[i][r]);
k++;
}
r--;
for(int j=r;j>=l && k<n*m;j--){
printf("%d ", a[b][j]);
k++;
}
b--;
for(int i=b;i>=u && k<n*m;i--){
printf("%d ", a[i][l]);
k++;
}
l++;
}
return 0;
} import java.util.Scanner;
public class Main {
public static void printMatrixBySpin(int[][] matrix) {
int tR = 0;
int tC = 0;
int dR = matrix.length - 1;
int dC = matrix[0].length - 1;
while (tR <= dR && tC <= dC) {
printEdge(matrix, tR++, tC++, dR--, dC--);
}
}
public static void printEdge(int[][] matrix, int tR, int tC, int dR, int dC) {
if (tR == dR) {
for (int i = tC; i <= dC; i++) {
System.out.print(matrix[tR][i] + " ");
}
} else if (tC == dC) {
for (int i = tR; i <= dR; i++) {
System.out.print(matrix[i][tC] + " ");
}
} else {
int curR = tR;
int curC = tC;
while (curC != dC) {
System.out.print(matrix[tR][curC++] + " ");
}
while (curR != dR) {
System.out.print(matrix[curR++][dC] + " ");
}
while (curC != tC) {
System.out.print(matrix[dR][curC--] + " ");
}
while (curR != tR) {
System.out.print(matrix[curR--][tC] + " ");
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] matrix = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
matrix[i][j] = sc.nextInt();
}
}
printMatrixBySpin(matrix);
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int matrix[][] = new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
matrix[i][j] = scanner.nextInt();
}
}
int startR=0,startC=0,endR=n-1,endC=m-1;
while(startR<=endR && startC<=endC){
if(startR==endR){
for(int j=startC;j<=endC;j++){
System.out.print(matrix[startR][j] + " ");
}
}else if(startC == endC){
for(int i=startR;i<=endR;i++){
System.out.print(matrix[i][startR] + " ");
}
}else{
int p=startC;
while(p<=endC){
System.out.print(matrix[startR][p] + " ");
p++;
}
p = startR+1;
while(p<=endR){
System.out.print(matrix[p][endC] + " ");
p++;
}
p = endC-1;
while(p>=startC){
System.out.print(matrix[endR][p] + " ");
p--;
}
p = endR - 1;
while(p>startR){
System.out.print(matrix[p][startC] + " ");
p--;
}
}
startR++;
startC++;
endR--;
endC--;
}
}
}
import java.util.Scanner;
public class Main {
public static void spiralOrderPrint(int[][] matrix) {
int tR = 0;
int tC = 0;
int dR = matrix.length - 1;
int dC = matrix[0].length - 1;
while (tR <= dR && tC <= dC) {
printEdge(matrix, tR++, tC++, dR--, dC--);
}
}
public static void printEdge(int[][] m, int tR, int tC, int dR, int dC) {
if (tR == dR) {
for (int i = tC; i <= dC; i++) {
System.out.print(m[tR][i] + " ");
}
} else if (tC == dC) {
for (int i = tR; i <= dR; i++) {
System.out.print(m[i][tC] + " ");
}
} else {
int curC = tC;
int curR = tR;
while (curC != dC) {
System.out.print(m[tR][curC] + " ");
curC++;
}
while (curR != dR) {
System.out.print(m[curR][dC] + " ");
curR++;
}
while (curC != tC) {
System.out.print(m[dR][curC] + " ");
curC--;
}
while (curR != tR) {
System.out.print(m[curR][tC] + " ");
curR--;
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String firstLine = sc.nextLine();
String[] size = firstLine.split(" ");
int n = Integer.valueOf(size[0]);
int m = Integer.valueOf(size[1]);
int[][] matrix = new int[n][m];
for(int i=0; i<n; i++){
String line = sc.nextLine();
String[] array = line.split(" ");
for(int j=0; j<m; j++){
matrix[i][j] = Integer.valueOf(array[j]);
}
}
spiralOrderPrint(matrix);
}
} def spiralOrderPrint(matrix, res): tR = 0 # 左上角的行 tC = 0 # 左上角的列 dR = len(matrix) - 1 # 右下角的行 dC = len(matrix[0]) -1 # 右下角的列 while tR <= dR and tC <= dC: printEdge(matrix, tR, tC, dR, dC, res) tR += 1 tC += 1 dR -= 1 dC -= 1 return res def printEdge(matrix, tR, tC, dR, dC, res): if tR == dR: # 当矩阵只有一行的时候 for i in range(tC, dC+1): res.append(matrix[tR][i]) # 当矩阵只有一列的时候 elif tC == dC: for i in range(tR, dR+1): res.append(matrix[i][tC]) else: curC = tC curR = tR while curC != dC: res.append(matrix[tR][curC]) curC += 1 while curR != dR: res.append(matrix[curR][dC]) curR += 1 while curC != tC: res.append(matrix[dR][curC]) curC -= 1 while curR != tR: res.append(matrix[curR][tC]) curR -= 1 if __name__ == '__main__': import sys n, m = list(map(int, sys.stdin.readline().split())) i = 0 matrix = [] while i < n: matrix.append(list(map(int, sys.stdin.readline().split()))) i+=1 res = [] res1 = spiralOrderPrint(matrix, res) res2 = '' for i in res1: res2 += str(i)+' ' print(res2)
#include<bits/stdc++.h>
using namespace std;
void print(vector<vector<int>>& v,int tR,int tC,int dR,int dC)
{
if(tR==dR)
{
for(int i=tC;i<=dC;++i)
cout<<v[tR][i]<<" ";
}
else if(tC==dC)
{
for(int j=tR;j<=dR;++j)
cout<<v[j][tC]<<" ";
}
else
{
int x = tR;
int y = tC;
while(y<dC)
{
cout<<v[x][y++]<<" ";
}
while(x<dR)
{
cout<<v[x++][y]<<" ";
}
while(y>tC)
{
cout<<v[x][y--]<<" ";
}
while(x>tR)
{
cout<<v[x--][y]<<" ";
}
}
}
int main()
{
int m,n;
cin>>m>>n;
vector<vector<int>>v(m,vector<int>(n,0));
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
cin>>v[i][j];
int tR = 0;
int tC = 0;
int dR = v.size()-1;
int dC = v[0].size()-1;
while(tR<=dR && tC<=dC)
print(v,tR++,tC++,dR--,dC--);
return 0;
}