給定一個n行m列的二維數組,要求按順時針螺旋順序輸出矩陣中的所有元素,n和m小于等于10
如下圖是一個三行四列的螺旋矩陣
要求輸出?1 2 3 4 8 12 11 10 9 5 6 7
全局變量定義
int a[11][11];
int vis[11][11]; // 訪問標記數組
關鍵代碼如下
?
int dx[] = {0, 1, 0, -1}; // 行方向
int dy[] = {1, 0, -1, 0}; // 列方向
int dir = 0; // dir: 0表示右, 1表示下, 2表示左, 3表示上,是順時針的方向
int num = 0;
int i = 0,j = 0;while (num < m * n) { //輸出完矩陣的所有元素就退出 if (i >= 0 && i < n && j >= 0 && j < m && vis[i][j] == 0){//不超過邊界且未被訪問printf("%d ", a[i][j]);vis[i][j] = 1;num++;} else { // 否則回退一步,并切換方向i -= dx[dir];j -= dy[dir];dir = (dir + 1) % 4; }// 更新下一步位置i += dx[dir];j += dy[dir];
}
給定矩陣的長度n,要求逆時針輸出一個n*n螺旋矩陣
例如輸入5,輸出如下,要求每個元素間隔四個空格且左對齊,如下圖
這題剛好跟上題相反,現在是輸出螺旋矩陣,這里螺旋矩陣的方向是逆時針,所以方向向量需要改一下
int dx[]={1,0,-1,0}; //逆時針是下、右、上、左
int dy[]={0,1,0,-1};
int n,i=0,j=0,num=1;
int dir=0;
scanf("%d",&n);
while(num<=n*n){ //num一直加1,然后按順序賦給數組元素,最后到n*nif(i>=0&&i<n&&j>=0&&j<n&&visit[i][j]==0){a[i][j]=num;num++;visit[i][j]=1;}else{i-=dx[dir];j-=dy[dir];dir=(dir+1)%4;}i+=dx[dir];j+=dy[dir];}
for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%-4d",a[i][j]); //隔四個空格且左對齊}printf("\n");
}
?
?