Chinaunix首页 | 论坛 | 博客
  • 博客访问: 528439
  • 博文数量: 118
  • 博客积分: 3995
  • 博客等级: 中校
  • 技术积分: 1276
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-15 12:15
文章分类

全部博文(118)

文章存档

2014年(1)

2013年(1)

2010年(6)

2009年(27)

2008年(10)

2007年(33)

2006年(38)

2005年(2)

我的朋友

分类:

2007-11-18 17:52:35

螺旋数(顺时针方向转) 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");
    }
}
阅读(1750) | 评论(0) | 转发(0) |
0

上一篇:产生随机数

下一篇:字符常量

给主人留下些什么吧!~~