矩陣轉換問題(蛇形打印,蛇形順序打印,之字打印)c方法

在某在線筆試遇到的題目就整理了下筆記來寫下這個一些部分矩陣的轉換問題。
問題描述:
輸入:
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++上檢驗可實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章