有错请指出!
对于模拟法,百度定义是
其实,没有这么麻烦,也就是题目是什么,我们就怎么写,也可以说它是不是算法的算法,最好把代码模块化
特点:
1.题目简单,代码量很大
2.不好找错误
3.在比赛中经常考
4.代码灵活
下面是几道例题
1.扑克游戏
三张扑克牌比大小,每个人从扑克牌中抽取三张牌,然后进行比较,规则如下:
点数规则:
A为最小,K为最大。A记为1点,JQK分别记为11点、12点、13点。
比较规则:
最大的牌:同点:三张牌点数相同。如果两个人都是三张点数相同,则比较点数大小。
第二大的牌:顺子:三张排的点数从小到大依次增加1。两人都是顺子的话,比最大的牌
最小的牌:既不是同点,也不是顺子:如果两个人都是这种牌型,则比较三张牌的点数之和。
程序输入:两行。
第一行:玩家甲三张牌的点数。用空格分开。1、11、12、13需要使用A、J、Q、K。0代表10。
第二行:玩家乙三张牌的点数。要求同上。
程序输出:一行。
根据判断结果输出:甲胜 乙胜 平手
A A A
8 8 8
乙胜
思路:模拟法经典题目,题目简单,代码量很大,没有思路,对着题目硬怼,这里用模块化版。
代码:
#include
using namespace std;
int a11[3]={0};
int b11[3]={0};
int pk(char a[3])
{
if(a[0]==a[1]&&a[0]==a[2]&&a[1]==a[2])
return 2;
else if(a[2]-a[1]==1&&a[1]-a[0]==1)
return 1;
else
return 0;
}
void print(int a1,int b1,int a2,int b2)
{
if(a1b1)printf("甲胜");
else{
if(a2>b2) cout<<"甲胜";
else if(a2>a[i];
}
void zfzs(char a[3])
{
for (int i=0;i<3;i++){
switch(a[i])
{
case 'A':a11[i]=1;break;
case '0':a11[i]=10;break;
case 'J':a11[i]=11;break;
case 'Q':a11[i]=12;break;
case 'K':a11[i]=13;break;
default:a11[i]=a[i]-'0';break;
}
}
}
void zfzsb(char b[3])
{
for (int i=0;i<3;i++){
switch(b[i])
{
case 'A':b11[i]=1;break;
case '0':b11[i]=10;break;
case 'J':b11[i]=11;break;
case 'Q':b11[i]=12;break;
case 'K':b11[i]=13;break;
default:b11[i]=b[i]-'0';break;
}
}
}
int main()
{
char a[3],b[3];
input(a);
input(b);
zfzs(a);
zfzsb(b);
int a1=pk(a),a2=a11[0]+a11[1]+a11[2];
int b1=pk(b),b2=b11[0]+b11[1]+b11[2];
print(a1,b1,a2,b2);
return 0;
}
2.NOIP小鱼会有危险吗
有一次,小鱼要从A处沿直线往右边游,小鱼第1秒可以游7米,从第2秒开始每秒游的距离只有前一秒的98%。
有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是探测范围。
一旦小鱼进入探测器的范围,探测器就会在这一秒结束时把信号传递给那个猎人,猎人在一秒后就要对探测器范围内的水域进行抓捕,这时如果小鱼还在这范围内就危险了。
也就是说小鱼一旦进入探测器范围,如果能在下1秒的时间内马上游出探测器的范围,还是安全的。
现在给出s和x的数据,请你判断小鱼会不会有危险?如果有危险输出y,没有危险输出n
一行,两个整数s和x
分别代表探测器距离A点的距离,已经探测器的监控范围
一个字符,y或者n
y代表小鱼会有危险,n代表没有危险
14 1
n
刚看上去,难死了,仔细一看,很简单
思路:速度越来越慢,进入危险区后,看看他一秒后逃出去了吗,出去了的话,没有危险(n),否则有危险(y)。
代码:
#include
using namespace std;
int main() {
double s,x;
cin>>s>>x;
double sum=0;
double v=7;
while (sums+x) {
cout<<"n";
} else {
cout<<"y";
}
return 0;
}
3.蓝桥杯算法提高 笨小猴
时间限制:1.0s 内存限制:256.0MB
问题描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
输入格式
输入文件只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。
输出格式
输出文件共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出0。
样例输入
error
样例输出
Lucky Word
2
样例说明
单词error中出现最多的字母r出现了3次,出现次数最少的字母出现了1次,3-1=2,2是质数。
样例输入
olympic
样例输出
No Answer
0
样例说明
单词olympic中所有字母都只出现了1次,1-1=0,0不是质数。
思路:定义一个数组,代表出现次数,遍历,让数组统计出现次数,用maxn - minn(minn不等于0)判断素数,如果是,输出Lucky word与maxn - minn的差否则输出No Answer和0。
代码:
#include
#include
using namespace std;
bool isPrime(int num) {
if(num == 0) {
return false;
} else if(num == 1) {
return false;
} else {
for (int i=2;i> c;
len = c.length();
for (int i=0;imaxn) {
maxn = ll[i];
}
if(ll[i]
4.骑士的金币(coin)
题目描述
国王将金币作为奖励,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币(N为任意正整数)。
你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。
输入
一个整数(范围1到10000),表示天数。
输出
骑士获得的金币数。
思路:太简单了,思路免了。
代码:
#include
using namespace std;
int main() {
int i=0,m=0,k,sum=0;
cin>>k;
while(i<=k) {
int s=0;
for (int j=1;j<=m;j++) s+=j;
if(s
5.NOIP真题:铺地毯
题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯
一共有n张地毯,编号从1到n
现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号
注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖
输入格式
输入共n+2行
第一行,一个整数n,表示总共有n张地毯
接下来的n行中,第 i+1行表示编号ii的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开
分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y轴方向的长度
第n+2行包含两个正整数x和y,表示所求的地面的点的坐标(x,y)
输出格式
输出共1行,一个整数,表示所求的地毯的编号
若此处没有被地毯覆盖则输出−1
输入样例1
3
1 0 2 3
0 2 3 3
2 1 3 3
2 2
输出样例1
3
思路:循环+判断
代码:
#include
using namespace std;
int a[10002],b[10002],x[10002],y[10002];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>x[i]>>y[i];
}
int p,q;
cin>>p>>q;
int ans=0;
for(int i=1;i<=n;i++){
if(p>=a[i]&&q>=b[i]&&p<=a[i]+x[i]&&q<=b[i]+y[i]){
ans=i;
}
}
if(ans==0){
cout<<-1<
6.马走日字
在我们的象棋中,棋子马是按照日字走格子的。 在右图所示的7x7棋盘中,我们需要计算中心点位的棋子马走到每个位置所需要的最短步数,如第一步可以走到写1的位置,这些位置的步数是1 如何使用代码来解决这个问题呢?
思路:我们取其中一个可以1步走到的格子,然后以这个格子为起点,依次查看下一步的所有位置,如果这个格子还没有写过数字,就写上2,如果已经有数字了,就不写。重复以上步骤,就可以写满整个棋盘。代码量还是很大。
代码:
#include
using namespace std;
int a[7][7] = {0};
int xc[8] = {-2,-2,-1,-1,1,1,2,2};
int yc[8] = {1,-1,2,-2,2,-2,1,-1};
void print()
{
for(int i = 0;i < 7;i++){
for(int j = 0;j < 7;j++){
printf("%3d",a[i][j]);
}
cout<=0)&&((j+yc[k])>=0)&&((j+yc[k]<=6))))){
if(a[i+xc[k]][j+yc[k]]==0){
a[i+xc[k]][j+yc[k]] = a[i][j]+1;
}
}
}
}
}
}
}
bool judge()
{
bool result = false;
for(int i = 0;i < 49;i++){
if(a[i/7][i%7]==0){
result = true;
}
}
return result;
}
int main()
{
a[3][3] = 1;
while(judge()){
fun();
}
for(int i = 0;i < 7;i++){
for(int j = 0;i < 7;j++){
a[i][j] -= 1;
}
}
print();
return 0;
}
建议电脑不好的不要试,因为电脑不好编译的不好,容易爆。
感谢您的观看!