yangwangna 2006-11-3 10:05
华为07年软件研发的最后一题
/*
华为07年软件研发的最后一题:
羽毛球场管理程序
ps:可能错误处理还不完善
*/
#include <iostream.h>
#define MAXSUM 100
#define error -1
unsigned char court[MAXSUM] = {0};
//数组置1子程序
void SET(int first, int num)
{
int i;
if(num == 1)
{
court[first] = 0xFF; //既是开始也是结束
return;
}
court[first] = 0xF0; //开始标志
for(i=first+1; i<first+num-1; i++)
court[i] = 1;
court[first+num-1] = 0x0F; //结束标志
}
//数组置0子程序
void CLR(int first, int last)
{
int i;
for(i=first; i<=last; i++)
court[i] = 0;
}
//申请n个球场
int request(int n)
{
int sum,i;
if(n<0 || n>MAXSUM) //非法n值
return error;
for(i=0; i<MAXSUM; i++)
{
sum = 0;
if(court[i] == 0)
{
sum++;
while(court[++i]==0 && sum<n && i<MAXSUM)
sum++; //0值计数
if(sum == n)
{
SET(i-n, n);
return i-n;
}
}
}
return error;
}
//释放球场,n为您所申请到的连续球场初始编号
int free(int n)
{
int i;
if(n<0 || n>MAXSUM) //非法n值
return error;
if((court[n] & 0xF0) != 0xF0) //n为非法初始编号
return error;
for(i=n; i<MAXSUM; i++)
if((court[i] & 0x0F) == 0x0F) //找出结束编号
break;
CLR(n, i);
return true;
}
//test
int main(int argc, char* argv[])
{
int test[6] = {2, 1, 30, 1, 20, 80};
int result[6];
int i;
//cout << request(10) <<endl;
for(i=0; i<6; i++)
{
result[i] = request(test[i]);
cout << "request:" << test[i] << "\tresult:" << result[i] <<endl;
//free(result[i]);
}
for(i=0; i<6; i++)
cout << "free succeed? " << free(result[i]) <<endl;
cout << "free succeed? " << free(5) <<endl;
return 0;
}