您的位置:首页 > 其它

百度之星 彩球游戏

2014-02-13 12:12 197 查看
彩球游戏

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: