百度之星 彩球游戏

彩球游戏

 

X 博士是一个研究儿童智力开发方法的科学家,他为幼儿教育领域做出了许多贡献。最近, X 博士正在研究一种适合儿童的游戏,用以辅助发展儿童的观察力、注意力和思维能力。经过连日的构思, X 博士终于设计出了一种游戏:彩球游戏。

彩球游戏是一种单人参与的游戏,游戏首先给出一串由许多不同颜色的小球组成的小球序列,以及一个整数参数 M ( M ≥ 2 )。一段连续的具有相同颜色的小球序列称为连续同色序列。小孩,即游戏参与者,每次可以向任意一段连续同色序列插入一个同色小球,使该序列的长度加一。当一段连续同色序列在插入一个同色小球后其长度达到 M 时,该序列就会爆炸消失,然后原序列两边的其余小球会重新连成一串,如果两段相同颜色的连续同色序列在此时连接在一起,它们就会合并形成一段新的连续同色序列。如果新形成的连续同色序列长度达到 M ,这段序列也会爆炸消失,然后重复上述过程,直到没有新的长度达到 M 的连续同色序列出现为止。游戏的目标很简单,就是插入尽量少的小球,使得所有小球都爆炸消失掉。

通过长时间的游戏和不断提高游戏水平,这个游戏可以很好地开发儿童的观察力、注意力和思维能力。但是 X 博士仍然面临着一个困难的问题,他还需要设计出一个游戏演示 AI 程序,可以以最优的方式(即插入的小球数量最小)进行游戏,用于游戏教学,或者在游戏中对小孩给出提示。 X 博士并不擅长此类程序,因而他无法完成这个任务,你可以帮助他吗?

输入格式:

输入文件包含多组测试数据。每组测试数据第一行为整数 M ( 2 ≤M≤20 ),第二行为一条非空的字符串,由大写字母组成且长度不超过 200 ,表示初始的一串小球,不同的字母表示不同的小球颜色。初始时可能会存在一些长度达到 M 的连续同色序列,但这些序列不会马上爆炸消失。

输出格式:

每组测试数据输出一行,表示至少需要插入多少次小球才能使所有小球爆炸消失掉。

输入样例:

3

AAABAAA

3

ABBABBA

输出样例:

2

2

说明:

共有 5 个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为 5 、 10 、 15 、 30 和 40 分,对每个测试数据集分别执行一次程序,每次必须在运行时限 30 秒内结束程序并输出正确的答案才能得分。

所有数据均从标准输入设备( stdin/cin )读入,并写出到标准输出设备 ( stdout/cout )中。

五个测试数据集中输入初始小球队列的长度分别不大于 10 、 20 、 50 、 100 和 200 ,各有不超过 5000 组测试数据。

 

include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>

int min=1000;

struct zimu
{
 char ch;
 int count;
};


int zhengli(struct zimu *str,int m,int n)
{
 int i,j;
 int flag;
 while(1)
 {
  flag=0;

  for(i=0;i<m;i++)
  {
   if(str[i].count%n==0)
    break;
  }
  if(i==m)
   return m;

  if(i==m-1)
  {
   m--;
  }
  for(j=i;j<m-1;j++)
  {
   str[j].count=str[j+1].count;
   str[j].ch=str[j+1].ch;
   flag=1;
  }
  if(flag==1)
  m--;

  for(i=0;i<m-1;i++)
  {
   if(str[i].ch==str[i+1].ch)
   {
    str[i].count=str[i].count+str[i+1].count;
    for(j=i+1;j<m-1;j++)
    {
     str[j].count=str[j+1].count;
     str[j].ch=str[j+1].ch;
    }
    m--;
    i=0;
   }

  }
  if(m==0)
   return m;

 


 }


}

 

int chuli(struct zimu *str,int m,int n)
{
 int i;

  for(i=0;i<m;i++)
  {
   if(str[i].count==n)
   {
    
    
    m=zhengli(str,m,n);
    i=0;
    if(m==0)
     return m;

   }
  }

  if(i==m)
   return m;

                        


}


void digui(struct zimu *str,int m,int n,int count)
{
 int i,j,temp;
 m=chuli(str,m,n);

 if(m==0)
 {
  if(count<min)
   min=count;
 }
/* for(i=0;i<m;i++)
 {

  for(j=0;j<str[i].count;j++)
   printf("%c",str[i].ch);

 }
  
 printf("     count=%d\n",count);*/

 
 struct zimu *str1=(struct zimu *)malloc(sizeof(struct zimu)*m);
 for(i=0;i<m;i++)
 {
 
  
  str1[i].count=str[i].count;
  str1[i].ch=str[i].ch;
  }

 for(i=0;i<m;i++)
 {
  for(j=0;j<m;j++)
  {
   
   str[j].count=str1[j].count;
   str[j].ch=str1[j].ch;
  }
  
  temp=str[i].count;
  count+=n-str[i].count;
  str[i].count=n;
  digui(str,m,n,count);
  str[i].count=temp;
  count=count-(n-str[i].count);
  
  
 }


 
}

 

 

void main()
{
 char a[200];
 char chr;
 
 int n;
 int i,j,k=0;
 int m;
 int len;
 int count=1;
 int flag=0;


 scanf("%d",&n);
 scanf("%c",&chr);
 gets(a);
 len=strlen(a);
 struct zimu *str=(struct zimu *)malloc(sizeof(struct zimu)*len);
 
 for(i=0;i<len;i++)
 {
  str[i].ch='/0';
  str[i].count=0;
 }

 for(i=0;i<len-1;i++)
 {
  if(a[i]==a[i+1])
   count++;
  else
  {
   str[k].ch=a[i];
   str[k].count=count;
   k++;
   count=1;
  }

  if(i==len-2&&a[len-2]==a[len-1])
  {
   str[k].ch=a[i];
   str[k].count=count;
   k++;
   count=1;
   flag=1;

  }
  
 }
 m=k;

 if(!flag)
 {
  str[k].ch=a[len-1];
  str[k].count=1;

  m=k+1;
 }
 int temp;

 

 
  struct zimu *str1=(struct zimu *)malloc(sizeof(struct zimu)*m);
  for(i=0;i<m;i++)
  {

   str1[i].count=str[i].count;
   str1[i].ch=str[i].ch;
  }
 for(i=0;i<m;i++)
 {
  for(j=0;j<m;j++)
  {
   
   str[j].count=str1[j].count;
   str[j].ch=str1[j].ch;
  }
  
 
  temp=str[i].count;
  count=n-str[i].count;
  str[i].count=n;
  digui(str,m,n,count);
  str[i].count=temp;


 }

 printf("%d\n",min);

 

 

 


}

 

 

posted on 2014-02-13 12:12  朱涵友  阅读(202)  评论(0)    收藏  举报

导航