石子合并

来源:互联网 发布:微信红包网络出错 编辑:程序博客网 时间:2024/04/29 16:00
  

int stone[255];  //0石子堆数,其他对应一堆石子的个数
char filePath[100];
int stoneNum = 0;

//////////////////////
//从c:\1.txt读取石子堆数,和每一堆石子的个数
void Init()
{
 char temp;
 FILE *fp;
 char bl = 0 ;
 printf("open file and read data\n");
 if( NULL == (fp = fopen(filePath,"rt")))
 {
  printf("open file is error\n");
  exit(0);
 }
 while(!feof(fp))
 {
  temp = getc(fp);
  //是数字的ascii,将其转ascii转换成数字,
  if('0' <= temp &&'9' >= temp )
  {
   stone[stoneNum] = stone[stoneNum]*10 + temp - '0';
   bl = 1;
  }
  else
  {
   //有数字编程空格的时候表示要读下一个数字,所有stoneNum++
   if(1 == bl)
   {
    stoneNum++;
    bl = 0;
   }
  }
 }
 stoneNum -- ;//本身记录的是所有读出数字的个数。因为第一个是总堆数 所以减去一个是堆数
 //看看数据是不是正确 给出的总堆数 是不是和读出的堆数相同
 if(stoneNum != stone[0] || 0 == stoneNum)
 {
  printf("input data is error !\n");
  exit(0);
 }
 printf("read data finish\n");

}


//////////////////
///<paramater name="max">max =1 最大分 其他 最小分<paramater>
int Value(int max)
{

 int i,s[255];
 int temp ,loc;
 int num = stoneNum;
 int result = 0 ;
 //将每堆的石子数转转移到另一个数据中
 //避免运算将石子数给清除了
 for(i =0; stoneNum>i;i++)
 {
  s[i] =stone[i+1];
 }
 //num现在还有多少石子堆要进行运算的
 //当num》2时候需要。从中找到需要的两堆石子
 while(2 < num )
 {
  //用来记录每次找到要计算的记过
  //每一轮的最大或者最小分
  temp = s[0] + s[num-1];
  //记录找到找到要合并的位置
  //0 位置和最后一个。其他都是和前面一
  loc = 0 ;
  for(i = 1; i < num ;i++)
  {
   //判断是要最大分
   if(max)
   {
    if(temp < s[i] + s[i-1])
    {
     temp = s[i] + s[i-1];
     loc = i ;
    }
   }
   else
   {
    if(temp > s[i] + s[i-1])
    {
     temp = s[i] + s[i-1];
     loc = i ;
    }
   }
  }
  result += temp ;
  //是否要合并0位置的
  if(0 == loc)
  {
   s[0] += s[num-1];
   s[num -1] = 0 ;
  }
  else
  {
   //以下两行是合并数据
   s[loc-1] += s[loc];
   s[loc] = 0 ;
   //将数据对齐到数据中,将不用的位置给替换掉
   for(i = 1; i < num-1 ;i++)
   {
    if(0 == s[i] )
    {
     s[i] = s[i+1];
     s[i+1] = 0 ;
    }
   }
  }
  num--;
 }
 result +=s[0]+s[1];
 return result ;
}

void Output(int max ,int min)
{
 FILE *fp;
 char file[100] = "c:\\output.txt";
 char r[6];
 remove(file);
 if(NULL ==(fp = fopen(file,"wt+")))printf("create ouput.txt error\n"),exit(0);
 sprintf(r,"%d\n%d",min,max);
 fwrite(r,sizeof(r),1,fp);
 fclose(fp);
 system(file);
 remove(file);
}

void PrintDate()
{
 int i ;
 printf("\ninput data :\nThere are %d groups of stones\n",stone[0]);
 for(i = 1; stoneNum >= i; i++ )
 {
  printf("%-4d",stone[i]);
 }
}

原创粉丝点击