逆序与蛇形输出矩阵
逆序
输入n,得到n*n矩阵,逆时针输出各项元素值,并空格隔开。
例,n=4,矩阵就是
1 2 3 4
5 6 7 8
9 10 11 12
13 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 4
5 6 7 8
9 10 11 12
13 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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。