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