题目描述
描述
现要生成一个新的n行m列螺旋矩阵,规则如下:从矩阵的右下角(第n行第m列)出发,初始向左移动;如果无法前进,或者已经到过前方的格子,则向右转。在经过的格子中依次填入1, 2, 3, ..., n * m,求这一新的螺旋矩阵。
输入格式
一行,为两个不大于10的正整数n和m。
输出格式
n行m列的螺旋矩阵,每一数字占3位,如果数字不足3位,则在前面补充空格。
样例1
输入
4 4
输出
7 8 9 10 6 15 16 11 5 14 13 12 4 3 2 1
#include <bits/stdc++.h>
int main(){
int a[15][15]={},n,m,cnt,s=0,t[4][2]={ {0,-1},{-1,0},{0,1},{1,0} };
scanf("%d%d",&n,&m); int x=n,y=m;
while(cnt<n*m){
if(x+t[s][0]>n||x+t[s][0]<1||y+t[s][1]>m||y+t[s][1]<1||a[x+t[s][0]][y+t[s][1]]) s=(s+1)%4;
cnt++,a[x][y]=cnt,x+=t[s][0],y+=t[s][1];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
if(a[i][j]) printf("%3d",a[i][j]);
else printf(" ");
printf("\n");
}
return 0;
}
压行版:
#include<bits/stdc++.h>
int main(){int a[15][15]={},n,m,cnt,s=0,t[4][2]={{0,-1},{-1,0},{0,1},{1,0}};scanf("%d%d",&n,&m);int x=n,y=m;while(cnt<n*m){if(x+t[s][0]>n||x+t[s][0]<1||y+t[s][1]>m||y+t[s][1]<1||a[x+t[s][0]][y+t[s][1]])s=(s+1)%4;cnt++,a[x][y]=cnt,x+=t[s][0],y+=t[s][1];}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)if(a[i][j])printf("%3d",a[i][j]);else printf(" ");printf("\n");}return 0;}