逆序與蛇形輸出矩陣
逆序
輸入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;
}