這題怎么做啊,求大神幫忙
uj5u.com熱心網友回復:
輸出螺旋方陣?uj5u.com熱心網友回復:
題目是輸出怎樣的正方形?uj5u.com熱心網友回復:
看上去像螺旋方陣思路比較簡單
比如 5*5的方陣,從二維陣列(0,0)點出發,按左上到右上(1,2,3,4),右上到右下(5,6,7,8),右下到左下(9,10,11,12),左下到左上(13,14,15,16)4個方向旋轉,每個方向最初列印n-1=4個元素,然后就會回到出發點(第一圈結束)
第二輪旋轉,修正出發點為二維陣列(1,1),還是按方向,每個方向列印n-1-2=2個元素(17,18),(19,20),(21,22),(23,24),然后又會回到出發點;繼續下一輪旋轉,修正出發點和每個方向列印的元素,直到計數到n*n
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
int main() {
int n,i,j,k,d,c,t,end;
printf("請輸入大于0的整數:");
scanf("%d", &n);
int **m = (int**)malloc(sizeof(int*)*n); //動態申請記憶體(二維陣列)
for (i=0; i<n; i++) {
m[i] = (int*)malloc(sizeof(int)*n);
}
end = n*n;
for (i=0, j=0, k=n-1, d=0, c=1;;) {//從(0,0)點開始出發,方向d=0是從左上到右下,每個方向列印k個元素,c從1開始計數
for (t=(k<=0?1:k); t>0&&c<=end; t--) {
if (d==0) //左上到右上
m[i][j++] = c++;
else if (d==1) //右上到右下
m[i++][j] = c++;
else if (d==2) //右下到左下
m[i][j--] = c++;
else //左下到左上
m[i--][j] = c++;
}
if (c>end) break; //計數到頭則退出回圈
d = (d+1)%4; //一共4個方向,走完一個方向就改成下一個方向
if (d==0) { //回到原點就重新修正出發點和每個方向列印元素個數
i++;
j++;
k -= 2; //為啥-2?因為左右各減少一個元素就是一共減少2個元素(上下方向同理)
}
}
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
printf("%3d ", m[i][j]);
}
printf("\n");
free(m[i]);
}
free(m); //釋放記憶體
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/22468.html
標籤:C++ 語言
上一篇:C++控制臺分段設色
