在某在線筆試遇到的題目就整理了下筆記來寫下這個一些部分矩陣的轉換問題。
問題描述:
輸入:
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++上檢驗可實現。