模拟法(随机数字模拟&过程模拟)

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

  

posted @ 2020-10-17 19:09  goldstine  阅读(435)  评论(0)    收藏  举报