这里先举个简单的例子,很多朋友以前一定写过类似这样的例子:求编写一函数,输入年月日,求出该日是该年的第几天.
好的,现在大家代码会怎么写呢?我的第一次代码大概是这样的:
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;
{
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;
}
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 ;
}
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 ;
}