一道校赛的题,题目忘了,但大概意思就是,输入 举证的行、列数,构造螺旋矩阵:
思路就是构造一个二维数组,然后全部填0,做为 螺旋填数时的碰壁判断
填数是从 1 到 x * y,所以外面套一个while循环,当填的数 < x*y 时,不断循环
里面主要构成是4个循环,分别负责,从左到右,从上到下,从右到左,从下到上的四条边的填数
其中,向单一方向进行移动的同时,不断的判断继续往该方向移动时的下一位是否已经填过数【非0】,未填过数,就不断循环填数,直到填过数,结束这个方向的边的填充循环
每次移动后,可以发现要填的数num,坐标 i j 可能会额外加减1,所以直接加个if判断,修正相关数据
#include<stdio.h> #include<string.h> int a[100][100]; int main(){ int x,y; memset(a,0,sizeof(a)); scanf("%d %d",&x,&y); int num = 0; int i = 1, j = 0; int re = x*y;// x行 y列 while(num < re){ while(j <= y && !a[i][j+1]){ a[i][++j] = ++num; } if(j > y) { j--;num--; } while(i <= x && !a[i+1][j]){ a[++i][j] = ++num; } if(i > x) { i--;num--; } while(j >= 1 && !a[i][j-1]){ a[i][--j] = ++num; } if(j < 1){ j++;num--; } while(i >= 1 && !a[i-1][j]){ a[--i][j] = ++num; } } //print for( i = 1;i <= x;i++){ for(j = 1;j <=y;j++) printf("%d ",a[i][j]); printf(" "); } return 0; }