模拟法(随机数字模拟&过程模拟)
(1)电梯问题
x向上6s,向下4秒。每次听下5秒
/*
模拟:电梯问题
*/
#include<iostream>
using namespace std;
int main(){
int n, m, sum, k;
while (cin >> n){
if (n == 0){ break; }
cin >> m;
sum = n * 5 + m * 6;
for (int i = 1; i < n; i++){
cin >> k;
sum += (m>k) ? (m - k) * 4 : (k - m) * 6;
m = k;
}
cout << sum << endl;
}
return 0;
}
(2)扑克洗牌
//模拟一次洗牌的过程
#include<iostream>
using namespace std;
//是用数组模拟洗牌前后
int p[10000], b[10000];
int main(){
int n;
cin >> n;
for (int i = 1; i <= 2 * n; i++){
p[i] = i;
cout << p[i] << " ";//初始化牌的顺序
}
cout << endl;
int cnt = 0;//记录洗牌的次数
for (int i = 0; i <= 20000; i++){
bool flag = true;
cnt++;
for (int k = 1; k <= n; k++){
b[2 * k] = p[k];
b[2 * k - 1] = p[n + k];
}
//洗完牌后的牌序列打印出来
for (int k = 1; k <= 2 * n; k++){
cout << b[k] << " ";
}
cout << endl;
//复制
for (int k = 1; k <= 2 * n; k++){
p[k] = b[k];
}
//判断是否和开始的时候一样
for (int k = 1; k <= 2 * n; k++){
if (p[k] != k){
flag = false;
}
}
if (flag){
cout << cnt << endl;
break;
}
}
system("pause");
return 0;
}
(3)进展模拟时间(随机数模拟)
#include<iostream>
#include<time.h>
using namespace std;
int main(){
int n, i;
cin >> n;
long t = time(NULL) % 1000;
srand(t);
for (t = 0, i = 1; i <= n; i++){
t += rand() % 61 + 20;
}
int s = t / 10;
cout << s << endl;
system("pause");
return 0;
}
(4)清除杂草
//清除杂草
#include<iostream>
using namespace std;
//数据结构
int l[200], r[200];//记录每一行最左边的,和最右边的杂草的位置
int num[200];//记录每一行中杂草的数量
int main(){
int n, m;
cin >> n >> m;
char ch;
for (int i = 1; i <= n; i++){
//每一行在开始都需要更新数据
num[i] = 0;
l[i] = r[i] = 0;
for (int j = 1; j <= m; j++){
cin >> ch;
if (ch == 'W'){//如果是杂草
num[i]++;
//左边必须用第一个更新
if (l[i] == 0){
l[i] = j;
}
//因为是按从左到右的顺序输入杂草的信息
r[i] = j;//每输入一个就更新
}
}
}/*通过输入数据更新数据结构*/
//开始除草
int start = 1;//开始位置
int ans = 0;//统计时间
int row = 0;
//统计有杂草的行数
for (int i = 1; i <= n; i++){
if (num[i] != 0){
row=i;
}
}
//对第行除草
if (num[1] != 0){
ans += (r[1] - start);
start = r[1];
}
for (int i = 2; i <= row; i++){
if (i % 2 == 0){//方向往左
if (r[i] > start){
ans += r[i] - l[i];
ans += r[i] - start;
}
else{
ans += (start - l[i]);
}
start = l[i];
}
else{//方向往右
if (start < l[i]){
ans += r[i] - start;
}
else{
ans += start - l[i];
ans += r[i] - l[i];
}
start = r[i];
}
}
ans += row - 1;
cout << ans << endl;
system("pause");
return 0;
}
(5)机器人指令
#include<iostream>
using namespace std;
char ch[10];//通过字符数组的方式存储字符串
char tmp[10];//存储第三种指令
int order[105];//表示第i条指令的移动方向
int main(){
int T, n;
cin >> T;
while (T--){
cin >> n;
memset(order, 0, sizeof(order));
for (int i = 0; i < n; i++){
cin >> ch;
if (ch[0] == 'L'){
order[i]--;
}
else if (ch[0] == 'R'){
order[i]++;
}
else{
int f = 0;
cin >> tmp;
cin >> f;
order[i] = order[f - 1];
}
}
int res = 0;
for (int i = 0; i < n; i++){
res += order[i];
}
cout << res << endl;
}
system("pause");
return 0;
}

浙公网安备 33010602011771号