螺旋数(顺时针方向转) 4*4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
基本思路:
1.建立n*n矩阵,初始化全0
2.从指定的入口开始,进入循环
while 还要数字要写
判断当前方向的下一位置没有越界并且没有被写入数据,则进入下一位置并写入数据
否则,改变方向
end while
代码(1)
#define N 100
/*s为一个2维数组,n为实际行列数*/
void bounce(int s[N][N],int n){
int i,j,end,num;
end=n*n;
for(i=0;i for(j=0;j s[i][j]=0;
}
}
i=0;
j=-1;
num=1;
n--;
while(num<=end){
while(j s[i][++j]=num++;
}
while(i s[++i][j]=num++;
}
while(j>0 && s[i][j-1]==0){
s[i][--j]=num++;
}
while(i>0 && s[i-1][j]==0){
s[--i][j]=num++;
}
}
}
代码(2)
#define N 100
#define DIR 4
#define ORI 2
const static int tb[DIR][ORI]={{0,1},{1,0},{0,-1},{-1,0}}; /*方位表*/
static inline int test(int s[N][N],int i,int j,int n,int dir);
void bounce(int s[N][N],int n){
int i,j,end,num,dir;
for(i=0;i for(j=0;j s[i][j]=0;
}
}
i=0;
j=-1; /*初始位置*/
num=1;
end=n*n;
n--;
dir=0; /*初始方向*/
while(num<=end){
if(test(s,i,j,n,dir)){
i+=tb[dir][0];
j+=tb[dir][1];
s[i][j]=num++;
}else{
dir=(dir+1)%DIR;
}
}
}
static inline int test(int s[N][N],int i,int j,int n,int dir){
i+=tb[dir][0];
j+=tb[dir][1];
if(i<0 || j<0 || i>n || j>n) return 0;
if(s[i][j]==0) return 1;
return 0;
}
***********************************
螺旋数变种(四个角上为空格)
1 2
8 9 10 3
7 12 11 4
6 5
只要讲(2)的代码稍加修改即可
#define N 100
#define DIR 4
#define ORI 2
const static int tb[DIR][ORI]={{0,1},{1,0},{0,-1},{-1,0}};
static inline int test(int s[N][N],int i,int j,int n,int dir);
void bounce1(int s[N][N],int n){
int i,j,end,num,dir,flag;
for(i=0;i for(j=0;j s[i][j]=0;
}
}
i=0;
j=-1;
num=1;
end=n*n-4;
n--;
dir=0;
s[0][0]=-1;
s[n][0]=-1;
s[0][n]=-1;
s[n][n]=-1;
while(num<=end){
if((flag=test(s,i,j,n,dir))){
i+=tb[dir][0];
j+=tb[dir][1];
if(flag==1){
s[i][j]=num++; /*写入数字*/
}else{
s[i][j]=-2; /*改变状态*/
}
}else{
dir=(dir+1)%DIR; /*改变方向*/
}
}
}
static inline int test(int s[N][N],int i,int j,int n,int dir){
i+=tb[dir][0];
j+=tb[dir][1];
if(i<0 || j<0 || i>n || j>n) return 0; /*越界*/
if(s[i][j]==0) return 1; /*该位置可写数字*/
if(s[i][j]==-1) return 2; /*特殊位置*/
return 0; /*该位置已经有数*/
}
/*打印函数*/
static void print(int s[N][N],int n){
int i,j;
for(i=0;i for(j=0;j if(s[i][j]>0) printf("%d\t",s[i][j]);
else printf("\t");
}
printf("\n");
}
}
阅读(1779) | 评论(0) | 转发(0) |