数据连续化处理

这里先举个简单的例子,很多朋友以前一定写过类似这样的例子:求编写一函数,输入年月日,求出该日是该年的第几天.

好的,现在大家代码会怎么写呢?我的第一次代码大概是这样的:

   

int GetDay(int year,int month,int day)
{
   int s=0;
   switch(month-1)
    {
    case 1:
        s=31; break;
    case 2:
        s=31+28; break;
    case 3:
        s=31+28+31; break;
    case 4:
        s=31+28+31+30; break;
      ...
    }
    //最后在下是否闰年
}

今天在fy网站上看了连续化处理后,感悟颇深.对上面的代码做了连续化处理:

 

代码
//返回这天是那一年的第几天
int GetDay(int year, int month, int day)
{
    
int sum=day;
    
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};

    
if(year%400==0 || (year%100 && year%4==0))  //判断闰年
    {
        
++m[1]; 
    }

    
for(int i=0; i<month-1;i++)
    {
        sum 
+= m[i];
    }
    
return sum;
}

怎么样?简浩很多吧.

这里在举个蛇形矩正输出的例子:

输入有多组数据,每组只有一行,包含x,y(1 <= x,y <= 30)和t,输出x*y螺旋方阵,如果t=0,就输出逆时针螺旋方阵,否则输出顺时针的

样例输入:
3 5 0
4 4 1

样例输出(每个数字要占四个格子,输出完一组就接着输出一个空行):
   1  12  11
   2  13  10
   3  14   9
   4  15   8
   5   6   7

   1   2   3   4
  12  13  14   5
  11  16  15   6
  10   9   8   7

连续化处理后的代码:

代码
#define SET_XY(x,y,d) x=sym[d][0], y=sym[d][1]
int main()
{
    
int m, n, t;
    
int sym[4][2]={{0,-1}, {1,0}, {0,1}, {-1,0}}; //连续化处理的关键
    while(scanf("%d%d%d"&m, &n, &t) != EOF)
    {
        
int map[32][32= {0}; //初始化数据
        int x, y, dx, dy, d, nStep = 2;
        
for(x = 1, y = m + 1; x <= n; x++//设置上下边界
            map[x][0= map[x][y] = -1;
        
for(x = 1, y = n + 1; x <= m; x++//设置左右边界
            map[0][x] = map[y][x] = -1;
        x 
= y = 1; d = 1 + (t == 0);
        SET_XY(dx, dy, d);
        
if(map[y+dy][x+dx]) //设置起始方向
        {
            d 
= (d+1+((t==0)<<1))%4//d就是方向
            SET_XY(dx, dy, d);
        }
        
for(map[1][1= 1;;nStep++//螺旋遍历
        {
            x 
+= dx , y += dy;
            map[y][x] 
= nStep;
            
if(map[y+dy][x+dx]) //碰到边界或者有数的地方
            {
                d
= (d+1+((t == 0)<<1))%4//改变方向
                SET_XY(dx, dy, d);
                
if(map[y+dy][x+dx])break//无处可走,退出
            }
        }
        
for(y = 1; y <= n; y++//输出结果
        {
            
for(x = 1; x <= m; x++)
                printf(
"%4d",map[y][x]);
            printf(
"\n");
        }
        printf(
"\n");
    }
    system(
"pause");
    
return 0;
}

 

文章来源:http://yzfy.org/dis/listpost.php?tid=629

posted @ 2010-04-22 11:03  云天  阅读(376)  评论(0编辑  收藏  举报