模拟法练习C++ 1

有错请指出!

对于模拟法,百度定义是

模拟法练习C++ 1_第1张图片

其实,没有这么麻烦,也就是题目是什么,我们就怎么写,也可以说它是不是算法的算法,最好把代码模块化

特点:

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

模拟法练习C++ 1_第2张图片

思路:循环+判断

代码:

#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;
}

建议电脑不好的不要试,因为电脑不好编译的不好,容易爆。

感谢您的观看! 

 

 

你可能感兴趣的:(C++,c++,开发语言,算法)