乐趣区

逆序与蛇形输出矩阵

逆序与蛇形输出矩阵
逆序
输入 n,得到 n * n 矩阵,逆时针输出各项元素值,并空格隔开。例,n=4,矩阵就是 1 2 3 45 6 7 89 10 11 1213 14 15 16 输出的内容就是:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10。
分析

首先,这是一个边界问题,从里到外,我们可以理解为运动问题,即从 Matrix[0][0],环绕矩阵外围一直运动到矩阵内部。我们可以定义 4 个方向,即 0 /1/2/3(右,下,左,上)。再定义 Mark[n][n]=1,每当输出一个数值时,便另 Mark[n][n]=0;通过判断边界调整方向。
代码块
int matrix[N][N];
int mark[N][N];
int main(){
int n;
while(scanf(“%d”,&n)!=EOF){
int t=1;
int i;
// 初始化
for(i=0;i<n;i++){
for(int j=0;j<n;j++){
matrix[i][j]=(t++);
}
}
for(i=0;i<n;i++){
for(int j=0;j<n;j++){
mark[i][j]=1;
}
}
printf(“\n”);
int count=n*n;
int go=0,x=0,y=0;
while(count–){
switch(go){
case 0: // 右
printf(“%d “,matrix[x][y]);
mark[x][y]=0;
if(mark[x][y+1]==0){
go=1;
x++;
}else{
y++;
}
break;
case 1: // 下
printf(“%d “,matrix[x][y]);
mark[x][y]=0;
if(mark[x+1][y]==0){
go=2;
y–;
}else{
x++;
}
break;
case 2: // 左
printf(“%d “,matrix[x][y]);
mark[x][y]=0;
if(mark[x][y-1]==0){
go=3;
x–;
}else{
y–;
}
break;
case 3: // 上
printf(“%d “,matrix[x][y]);
mark[x][y]=0;
if(mark[x-1][y]==0){
go=0;
y++;
}else{
x–;
}
break;
}
}
printf(“\n”);

}
return 0;
}

蛇形
输入 n,得到 n * n 矩阵,蛇形输出各项元素值,并空格隔开。例,n=4,矩阵就是 1 2 3 45 6 7 89 10 11 1213 14 15 16 输出的内容就是:1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16
分析
这也是一题边界问题,该矩阵输出有 4 个方向,即 0 /1/2/3(右,左下,下,右上),每当到达边界,只需判断下一步大方向即可。
代码块
int count=n*n-1;
int go=0,x=0,y=0;
printf(“%d “,matrix[x][y]);
mark[x][y]=0;
while(count–){
switch(go){
case 0: // 右
y++;
printf(“%d “,matrix[x][y]);
mark[x][y]=0;
if(x==0){
go=1;
}else if(x==n-1){
go=3;
}
break;

case 1: // 左下
if(x<n-1 && y>0){
x++;
y–;
}
printf(“%d “,matrix[x][y]);
if(y==0 && x==n-1){
go=0;
}else if(y==0){
go=2;
}else if(x==n-1){
go=0;
}
break;

case 2: // 下
x++;
printf(“%d “,matrix[x][y]);
mark[x][y]=0;
if(y==0 || x==n-1){
go=3;
}else if(y==n-1){
go=1;
}
break;

case 3: // 右上
if(x>0 && y<n-1){
x–;
y++;
}
printf(“%d “,matrix[x][y]);
mark[x][y]=0;
if(y==n-1 && x==0){
go=2;
}else if(y==n-1){
go=2;
}else if(x==0){
go=0;
}
break;

}

退出移动版