在信息学奥赛中,有一类问题是模拟一个游戏的对弈过程,或者模拟一项任务的操作过程,进行统计计分、判断输赢等。这些问题很难建立数学模型用特定算法解决,一般只能采用“模拟”法。
所谓模拟法,就是用计算机模拟某个过程,通过改变数学模型的各种参数,进而观察变更这些参数所引起的过程状态的变化,然后从中得出解答。
用模拟法解题必须关注以下几个问题:
◆ 审题要仔细,游戏规则不能错;
◆ 分析要全面,各种特例不能漏;
◆ 编程要细心,测试数据要到位。
模拟的步骤:读题-> 建模->代码实现->调试、优化
❶、读懂题目,用纸和笔,针对样例数据,模拟计算一遍,理清各个数据之间的内在逻辑。
❷、建立数学模型。
❸、用计算机模拟出来数据的处理过程。
模拟法一般可以用于解决CSP-J第二轮的第1、2道题目。
实例:用模拟算法来编写一个猜数字游戏。由计算机随机生成一个1~100的整数,然后由用户来猜这个数,根据用户猜测的次数分别给出不同的提示文字。游戏演示过程如下:
#include <time.h>
#include <iostream>
using namespace std;
int main(){
int n,m,i=0;
srand(time(NULL));
n=rand()%100+1;
do{
cout<<"输入猜测的数";
cin>>m;
i++;
if(m>n) cout<<"NO!数太大了" <<endl;
else if(m<n) cout<<"NO!数太小了"<<endl;
}while(m!=n);//没有猜中结果n,则继续
cout<<"yes"<<endl;
cout<<"一共猜了"<<i<<"次" ;
return 0;
}