關於螺旋三角形和螺旋正方形的輸出表示
阿新 • • 發佈:2019-02-07
今天遇到了輸出順時針輸出螺旋三角形的問題,花了點時間寫了一下。於是,又想到了逆時針輸出的情況,最後又想試著輸出正方形的順時針和逆時針
10
1 2 3 4 5 6 7 8 9 10
27 28 29 30 31 32 33 34 11
26 45 46 47 48 49 35 12
25 44 54 55 50 36 13
24 43 53 51 37 14
23 42 52 38 15
22 41 39 16
21 40 17
20 18
19
#include<iostream> //順時針螺旋三角形(非遞迴) using namespace std; int a[21][21]; int direction[3][2]={{0,1},{1,-1},{-1,0}}; void setValue(int n) { int i,count=0; int cx=0; int cy=0; int no=1; int tx,ty; for(i=0;i<n;i++) { count=n-i; while(count--) { cx=cx+direction[i%3][0]; cy=cy+direction[i%3][1]; a[cx][cy]=no++; } } } int main() { int n,i,j; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); setValue(n); for(i=0;i<n;i++) { for(j=1;j<=n-i;j++) printf("%4d",a[i][j]); printf("\n"); } } return 0; }
別人說遞迴很方便,於是就用了一下遞迴。。
想到了逆時針。。#include<iostream> //遞迴順時針螺旋三角形 using namespace std; int a[21][21]; int count; int N; void setValue(int k,int n) { int i; for(i=k;i<n-k;i++) a[k][i]=++count; for(i=k+1;i<n-k;i++) a[i][n-1-i]=++count; for(i=k;i<n-2-k;i++) a[n-2-i][k]=++count; if(count==N*(N+1)/2) return ; else setValue(k+1,n-1); } int main() { int n,i,j; while(scanf("%d",&n)!=EOF&&n) { memset(a,0,sizeof(a)); count=0; N=n; setValue(0,n); for(i=0;i<n;i++) { for(j=0;j<n-i;j++) printf("%4d",a[i][j]); printf("\n"); } } return 0; }
#include<iostream> //遞迴逆時針螺旋三角形 using namespace std; int a[21][21]; int count; int N; void setValue(int k,int n) { int i; for(i=k;i<n-k;i++) a[i][k]=++count; for(i=n-2-k;i>=k;i--) a[i][n-i-1]=++count; for(i=n-k-2;i>=k+1;i--) a[k][i]=++count; if(count==N*(N+1)/2) return ; else setValue(k+1,n-1); } int main() { int n,i,j; while(scanf("%d",&n)!=EOF&&n) { count=0; N=n; setValue(0,n); for(i=0;i<n;i++) { for(j=0;j<n-i;j++) printf("%4d",a[i][j]); printf("\n"); } } return 0; }
聯想到了正方形。。
#include<iostream> //遞迴順時針螺旋正方形
using namespace std;
int a[21][21];
int count;
int N;
void setValue(int k,int n)
{
int i;
for(i=k;i<n;i++)
a[k][i]=++count;
for(i=k+1;i<n;i++)
a[i][n-1]=++count;
for(i=n-2;i>=k;i--)
a[n-1][i]=++count;
for(i=n-2;i>k;i--)
a[i][k]=++count;
if(count==N*N)
return ;
else
setValue(k+1,n-1);
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF&&n)
{
count=0;
N=n;
setValue(0,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
return 0;
}
又來個逆時針的。。。
#include<iostream> //遞迴逆時針螺旋正方形
using namespace std;
int a[21][21];
int count;
int N;
void setValue(int k,int n)
{
int i;
for(i=k;i<n;i++)
a[i][k]=++count;
for(i=k+1;i<n;i++)
a[n-1][i]=++count;
for(i=n-2;i>=k;i--)
a[i][n-1]=++count;
for(i=n-2;i>k;i--)
a[k][i]=++count;
if(count==N*N)
return ;
else
setValue(k+1,n-1);
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF&&n)
{
count=0;
N=n;
setValue(0,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
return 0;
}
感覺暫時常見的就這幾種,就這麼多吧,很少發博,多包涵。。。。