矩阵转换问题(蛇形打印,蛇形顺序打印,之字打印)c方法

来源:互联网 发布:java socket api 编辑:程序博客网 时间:2024/05/16 10:53

在某在线笔试遇到的题目就整理了下笔记来写下这个一些部分矩阵的转换问题。
问题描述:
输入:
123
894
765
输出:123456789

#include <stdio.h>int main(int argc, char *argv[]){  int min, max; //分别指向两个对角,并向内收缩  int i, j, n, a[100][100]; //定义足够大的数组  printf("请输入矩阵的阶及矩阵...\n");  scanf("%d", &n);  for(i=0; i<n; i++)  {    for(j=0; j<n; j++)      scanf("%d", &a[i][j]);    }    for(min=0,max=n-1; min<=max; min++,max--)//嵌套收缩   {    for(i=j=min; j<=max; j++)         //从左到右      printf("%d ", a[i][j]);        for(i=min+1,j=max; i<=max; i++)    //从上到下printf("%d ", a[i][j]);     for(i=max,j=max-1; j>=min; j--) //从右到左      printf("%d ", a[i][j]);     for(i=max-1,j=min; i>=min+1; i--) //从下到上      printf("%d ", a[i][j]);          }printf("\n");   return 0;}
第二种
输入:
1 2 3
4 5 6
7 8 9
输出:
1 2 3
8 9 4
7 6 5

#include <stdio.h>int main(int argc, char *argv[]){  int min, max; //分别指向两个对角,并向内收缩  int i, j, n, a[100][100]; //定义足够大的数组  printf("请输入矩阵的阶及矩阵...\n");  scanf("%d", &n);  for(i=0; i<n; i++)  {    for(j=0; j<n; j++)      scanf("%d", &a[i][j]);    }    int count[100][100]= {0};  int m = 1;  for(min=0,max=n-1; min<=max; min++,max--)//嵌套收缩   {    for(i=j=min; j<=max; j++)         //从左到右      {       count[i][j]=m++;        }                for(i=min+1,j=max; i<=max; i++){ count[i][j]=m++;     //从上到下     }              for(i=max,j=max-1; j>=min; j--){ count[i][j]=m++;   //从右到左   }              for(i=max-1,j=min; i>=min+1; i--)   {  count[i][j]=m++;  //从下到上  }          }  for(i = 0 ;i < n;i++)  {  for(j = 0;j < n;j ++)  printf("%d ",count[i][j]);  printf("\n");  }    return 0;}

之字形状打印,
输入如:
1  2  3  
4  5  6
7  8  9
打印结果是:1 4 2 3 5 7 8 6 9。

#include<stdio.h>#include<stdlib.h> void PrintfDown(int (*a)[3],int &i,int &j){    while (1)    {        printf(" %d ",a[i][j]);        if (i >= 2 || j <= 0)break;        j--;        i++;    }    if (i == 2)        j++;    else        i++;}void PrintfUp(int (*a)[3],int &i,int &j){    while(1)    {        printf(" %d ",a[i][j]);        if (j >= 2 || i <= 0 )break;        j++;        i--;    }    if (i <= 0)        j++;    else        i++;}void Grial(int(*a)[3], int n){    int i = 0;    int j = 0;    while (i != 3 && j != 3)    {        PrintfDown(a, i, j);        if (i == 3 || j == 3)break;        PrintfUp(a,i,j);    }}int main(){    int a[][3] = {1,2,3,                  4,5,6,                  7,8,9};    Grial(a, 3);    return 0;}

之字形打印矩阵的c++版本

#include<iostream>#include<cstdlib>#include<iomanip>using namespace std;void zigzagPrintLine(int (*matrix)[4], int leftX, int leftY, int rightX, int rightY, bool isFromBottom){    if(isFromBottom)        while(leftX >= rightX)            cout << matrix[leftX--][leftY++] << " ";    else        while(rightX <= leftX)            cout << matrix[rightX++][rightY--] << " ";} void zigzagPrintMatrix(int (*matrix)[4], int height, int width){    int leftX = 0, leftY = 0, rightX = 0, rightY = 0;    int endX = height - 1, endY = width - 1;    bool isFromBottom = true;    while(leftY <= endY && rightX <= endX)    {        zigzagPrintLine(matrix,leftX,leftY,rightX,rightY,isFromBottom);        if(++leftX > endX)        {            leftX = endX;            leftY++;        }        if(++rightY > endY)        {            rightY = endY;            rightX++;        }        isFromBottom = !isFromBottom;    }}void printMatrix(int (*matrix)[4], int height, int width){    for(int i = 0; i < height; i++)    {        for(int j = 0; j < width; j++)            cout << setw(2) << matrix[i][j] << " ";        endl(cout);    }}int main(void){    int matrix[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};    endl(cout << "Original Matrix: ");    printMatrix(matrix,4,4);    endl(cout << "=============");    endl(std::cout << "Zigzag output:");    zigzagPrintMatrix(matrix,4,4);    return 0;}


全部代码已经在dev-c++上检验可实现。

0 0
原创粉丝点击