百度之星 彩球游戏
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);
}
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);
}
相关文章推荐
- Struts2中的properties文件详解
- 获取AndroidManifest对应的标签信息
- decommission老系统的体会
- ubuntu12.04误删dpkg文件夹的解决方法
- AppStore 上架中的分类
- 如何输出高精度时间差
- @Transactional注解分析
- 数据结构实验:哈希表
- 中国物联网的随笔
- css3 gradient
- 深入学习android之AlarmManager|后台应用不应做Android待机电池杀手
- 学习笔记 PHP中的流程控制书写方式有两种可选形式 [第二课]
- 精 挑 细 选
- 项目管理软件之易度1.5,禅道2.0,redmine1.2(附redmine1.2的安装)
- 电源指示灯亮了,但是没有电源的符号
- (转)如何实现CSS限制字数,超出部份显示点点点...
- UVa 11234 Expressions解题报告
- NYOJ 181 小明的难题
- 虚拟机VirtualBox、Vmware上安装64位系统
- 在Eclipse中导入Android项目后,项目报红叉问题