我想以下列方式显示5 * 5矩阵的输出:
输入:
1 2 3 4 5
6 7 8 9 0
1 3 5 7 9
2 4 6 8 0
1 4 3 7 0
输出:
1 2 3 4 5 0 9 0 0 7 3 4 1 2 1 6 7 8 9 7 8 6 4 3 5
我已经编写了以下程序,但我无法获得如上所述的输出。这是什么错误?
#include<stdio.h>
int main()
{
int i, j, m, n, a[5][5];
scanf("%d%d", & m, & n);
if (m >= 1 && m <= 5 && n >= 1 && n <= 5)
{
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", a[i][j]);
}
}
if (m == 5 && n == 5)
{
for (i = 0; i == 0; i++)
{
for (j = 0; j < n; j++)
{
printf("%d", a[i][j]);
}
}
for (i = 0; i < n; i++)
{
for (j = n - 1; j == n - 1; j++)
{
printf("%d", a[i][j]);
}
}
for (i = n - 1; i == n - 1; i++)
{
for (j = n - 2; j >= 0; j--)
{
printf("%d", a[i][j]);
}
}
for (i = n - 2; i >= n - 4; i--)
{
for (j = 0; j == 0; j++)
{
printf("%d", a[i][j]);
}
}
for (i = n - 4; i == n - 4; i++)
{
for (j = n - 4; j <= n - 2; j++)
{
printf("%d", a[i][j]);
}
}
for (i = n - 3; i == n - 3; i++)
{
for (j = n - 2; j >= n - 4; j--)
{
printf("%d", a[i][j]);
}
}
}
}
return 0;
}
答案 0 :(得分:1)
使用
if(m>=1 && m<=5 && n>=1 && n<=5)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
您将在屏幕上显示输出并使用
printf("%d\t",a[i][j]);
清楚地显示输出 对代码进行此更改,您没有正确循环遍历矩阵,
#include<stdio.h>
int main()
{
int i,j,m,n,a[5][5];
scanf("%d%d",&m,&n);
if(m>=1 && m<=5 && n>=1 && n<=5)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
if(m==5 && n==5)
{
for(i=0;i==0;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t",a[i][j]);
}
}
for(i=1;i<n;i++)
{
for(j=n-1;j==n-1;j++)
{
printf("%d\t",a[i][j]);
}
}
for(i=n-1;i==n-1;i++)
{
for(j=n-2;j>=0;j--)
{
printf("%d\t",a[i][j]);
}
}
for(i=n-2;i>=n-4;i--)
{
for(j=0;j==0;j++)
{
printf("%d\t",a[i][j]);
}
}
for(i=n-4;i==n-4;i++)
{
for(j=n-4;j<=n-2;j++)
{
printf("%d\t",a[i][j]);
}
}
for(i=n-3;i<=n-2;i++)
{
for(j=n-2;j==n-2;j++)
{
printf("%d\t",a[i][j]);
}
}
for(i=n-2;i==n-2;i++)
{
for(j=n-3;j>=n-4;j--)
{
printf("%d\t",a[i][j]);
}
}
for(i=n-3;i==n-3;i++)
{
for(j=n-4;j<=n-3;j++)
{
printf("%d\t",a[i][j]);
}
}
}
}
return 0;
}
此循环仅在您编码时为5 * 5。
答案 1 :(得分:0)
5 * 5样本
#include<stdio.h>
int main(){
int i,j,m,n,a[5][5];
//scanf("%d %d",&m,&n);
//if(m>=1 && m<=5 && n>=1 && n<=5){
m = n = 5;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d", &a[i][j]);
}
}
int side_size = m;
int row = 0, col = 0;//start point
int side = side_size -1;
while(side > 1){
for(i = 0; i<side ;++i)
printf("%d ", a[row][col++]);//MOVE RIGHT
for(i = 0; i<side ;++i)
printf("%d ", a[row++][col]);//MOVE DOWN
for(i = 0; i<side ;++i)
printf("%d ", a[row][col--]);//MOVE LEFT
for(i = 0; i<side ;++i)
printf("%d ", a[row--][col]);//MOVE UP
++row;++col;
side -= 2;
}
printf("%d\n", a[row][col]);
return 0;
}
答案 2 :(得分:0)
我会使用前进和右转方法
int max_x = 4;
int min_x = 0;
int max_y = 4;
int min_y = 0;
int x = 0;
int y = 0;
int direction = 0; // 0-RIGHT, 1-DOWN, 2-LEFT, 3-UP
int count = 0;
int go_forward(){
switch(direction){
case 0:
if( x+1 > max_x ){ min_y++; return 1; }
else x++;
break;
case 1:
if( y+1 > max_y ){ max_x--; return 1; }
else y++;
break;
case 2:
if( x-1 < min_x ){ max_y--; return 1; }
else x--;
break;
case 3:
if( y-1 < min_y ){ min_x++; return 1; }
y--;
break;
}
return 0;
}
int turn_right(){
direction = (direction+1)%4; // 0-RIGHT, 1-DOWN, 2-LEFT, 3-UP
}
int main(){
/* int matrix[5][5]={ { 1, 2, 3, 4, 5},
{ 6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 24, 25}}; //TEST */
//get matrix from input
int cango;
do{
printf("%d ", matrix[y][x]);
count++;
cango = go_forward();
if( cango!=0 ){
turn_right();
cango = go_forward();
}
}while(cango == 0 && count < 25);
return 0;
}