骰子 C++

C++骰子游戏课程设计(含源码) 开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。 阅读详情

题目描述:

给出一个RC列的空白表格,在表格的左上方第一个格子处放了一枚骰子。骰子有六个面,分别有123456这六个数字,其中,相反两面的数之和为7.骰子初始的时候是这样放置的,上面为1,右侧那一面为3。现在将骰子进行下面4种操作:

1.往右滚动,直到达到最后一列。

2.往下滚动,达到下一行

3.往左滚动,直到达到第一列。

4.往下滚动,到达到下一行。

现在你按照上面的4种操作,依次进行,直到将所有格子都走一遍。每走到一个格子上,将骰子最上方那面的数字记下来。最后,求出所有记下来的数字之和。

输入:

两个整数R,C.(R,C均为小于100000的正整数)

输出:

所有数字之和。

50%的数据,R,C均小于100.

输入样例1

3 2

输出样例1:

19

输入样例2

3 4

输出样例2

42

输入样例3

737 296

输出样例3

763532

 样例1解释:

1

4

1

5

3

5

 

最初思路:通过循环求出骰子在表格中滚动产生的循环,并以此规律求解。但保存规律使用的二维数组容量不够,并且时间复杂度很高,所以只过了一半左右的数据。程序如下:

#include<cstdio>
#include<iostream>
using namespace std;
long long r,c;
long long looplen;
long long loopsum;
char loop[2000][2000];
bool flag = true;
void findloop()
{
	int up=1, front=2, right=3;
	int tu, tf, tr;
	bool dir = true;
	int i, j, k;
	for (i=1; i<=r; ++i)
	{
		if (dir)
		{
			for (j=1; j<=c; ++j)
			{
				tu=up, tf=front, tr=right;
				loop[i][j] = up;
				if (j<c)
					up = 7-tr, right = tu;
				else
					up = 7-tf, front = tu;
			}
		}
		else{
			for (j=c; j>=1; --j)
			{
				tu=up, tf=front, tr=right;
				loop[i][j] = up;
				if (j>1)
					up = tr, right = 7-tu;
				else
					up = 7-tf, front = tu;
			}
		}
		dir = !dir;
		if (i > 1)
		{
			bool bl = true;
			for (k=1; k<c; ++k)
				if (loop[1][k]!=loop[i][k])
				{
					bl = false;
					flag = false;
					break;
				}
			if (bl)
			{
				looplen = i-1;
				break;
			}
		}
	}
	if (!flag)
	{
		for (i=1; i<=looplen; ++i)
			for (j=1; j<=c; ++j)
				loopsum += loop[i][j];
	}
}
int main()
{
	//freopen("dice.in","r",stdin);
	//freopen("dice.out","w",stdout);
	int i, j;
	cin >> r >> c;
	findloop();

	if (looplen)
	{
		long long ans = loopsum*(r/looplen);
		for (i=1; i<=r%looplen; ++i)
			for (j=1; j<=c; ++j)
				ans += loop[i][j];
		cout << ans;
	}
	else
	{
		long long ans=0;
		for (i=1; i<=r; ++i){
			for (j=1; j<=c; ++j)
				ans += loop[i][j];
		}
		cout << ans;
	}
}

在写以上程序时,由于没有注意到输入数据可能不到一个循环的情况,looplen变量可能为0,作为除数会爆运行错误,这个地方花了接近两个小时才发现。


考完后,发现一大牛用500+b就把这道题A了。他提供的解法是:将每一次横向滚动的次数优化(横向滚动时每四次就会产生一次循环,每次循环时骰子朝上的面值之和为14),这样优化后最坏的时间复杂度为O(3n),因此完全可以过本题的所有数据。

我按这种算法写出的代码如下:

#include<iostream>
using namespace std;
long long r,c,ans;
int main()
{
	cin >> r >> c;
	bool dir = true;
	int i, j;
	int up=1, front=2, right=3;
	int tu, tf, tr;
	for (i=1; i<=r; ++i)
	{
		if (dir)
		{
			ans += c/4*14;
			for (j=c/4*4+1; j<=c; ++j)
			{
				ans += up;
				tu=up, tf=front, tr=right;
				if (j<c) up = 7-tr, right = tu;
				else up = 7-tf, front = tu;
			}
			dir = !dir;
		}
		else{
			ans += c/4*14;
			for (j=c-c/4*4; j>=1; --j)
			{
				ans += up;
				tu=up, tf=front, tr=right;
				if (j>1) up = tr, right = 7-tu;
				else up = 7-tf, front = tu;
			}
			dir = !dir;
		}
	}
	cout << ans;
}

 

以后做这种题,要想好最佳解法了再写代码,免得走很多弯路。写代码的时候也应该保持清醒,不要犯一些低级错误。

 

RVDS与MDK-ARM比较 1、RealView Microcontroller Development Kit(RealView MDK)开发套件--中国版RealView MDK开发工具源自德国Keil公司,被全球超过10万的嵌入式开发工程师验证和使用,是ARM公司目前最新推出的针对各种嵌入式处理器的软件开发工具。RealView MDK集成了业内最领先的技术,包括µVision3集成开发环境与 RealView编译 阅读详情

相关推荐

ARM 之四 各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK)

吐槽   最近,ARM官网进行了较大的改版,原来很多老工具可以免费下载(付费使用),但是改版后需要有购买凭证才可以下载!部分旧工具(补丁)的具体下载地址为https://silver.arm.com,最新的工具在官网还是非常容易下载的。难不成被日本收购有关??下文中也给出了目前我找到的部分工具的下载地址。 某些工具在ARM官网直接搜不到下载地址,目前的一个可用的下载技巧是,在Keil的官...

技术干货 2万+

C++编写的掷骰子程序

每个骰有6面,点数为1,2,3,4,5,6,游戏者在程序运行时输入一个无符号整数,作为产生的随机数的种子,每轮投两轮,第一轮如果和数为7或11则为胜,游戏结束……

C++骰子游戏 (C++ 实例程序教学7)

通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是为了便于程序调试。若要产生每次不同的随机数,可以使用。3.根据上述游戏规则,进行一个switch流程控制,检测每次掷骰子后的两颗的点数和,更新游戏状态(赢了/输了/再掷一次)1.自定义一个返回整数类型的RollDice函数,模拟1-6的掷骰子过程;函数产生随机化种子,随着seed的不同,就能够产生不同的随机数。rand()不需要参数,它会返回一个。如果你需要一个1-100的随机整数,可使用。,最大随机数的大小通常是固定的一个。

shanlinhan的博客 921

c++骰子

课程设计 c++ 无图形界面 理解c++有帮助

每个面由1~6的不同标签标识。编写一个程序,读取分配给每个标签的整数和一系列骰子的滚动命令,并在模拟后输出顶面数字。骰子的初始位置如上图所示。

编写一个程序来模拟掷骰子骰子构造如下图: 如图所示,每个面由1~6的不同标签标识。 编写一个程序,读取分配给每个标签的整数和一系列骰子的滚动命令,并在模拟后输出顶面数字。骰子的初始位置如上图所示。 输入 在第一行中,指定给面的六个整数对应1~6的标签顺序给出。 在第二行中,给出了表示命令序列的字符串,字符串以EOF结束输入。该命令是“E”、“N”、“S”和“W”中的一个,表示上图所示的四个方向。 输出 输出模拟后显示在顶面上的整数。 数据范围 0≤每个面指定的整数≤100 0≤命令的长

wry15082983136的博客 715

骰子游戏 - Ⅱ c++题解

c++ 骰子游戏2 题解

shddhjs的博客 492

JZOJ2017.08.06 C组

T1题目描述在12月份开始的时候,选举也开始了。每个选举区将有14个代表选出,每个选民是投票给几个政党中的某一个的,投票结束以后,用一种特殊的办法来产生代表。 首先,我们要找出所有至少获得5%选票的政党。每个政党的选票数量将被依次除以1到14,我们把得到的结果叫做每个政党的分数。 第一个代表将从得分最高的政党中产生,第二个政党将从得分第二的政党中产生,依次类推,直到所有的14名代表都产生。(说明:这

Brute♂force 927

安装rvds到windows7

后面要用proteus方针ARM7,需要一个集成开发环境。SDT是arm公司最早的一款产品,现在已经被ADS替代;ADS最新的产品是1.2,很多试验箱用的都是ADS;但是ADS也早就不更新了,现在用的较多的是RVDS也就是realview development suite。AR

3179

RVDS4.0安装

今天上午下载了RVDS4.0并安装破解成功了,还建立了一个裸机工程,使用AXD下载仿真成功了,RVDS4.0是基于eclipse的,但是比eclipse启动稍快一点,在WIN7下兼容等非常好,除了调试不方便外,强烈建议使用RVDS4.0,抛弃垃圾的RVDS2.2,折磨人.     1.下载地址,电驴资源,可使用迅雷下载,使用虚拟光驱打开或者直接用WINRAR解压安装,注意不要与RVDS2.2

与其用泪水悔恨昨天,不如用汗水拼搏今天 3万+

各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK)

关注、星标公众号,直达精彩内容整理:技术让梦想更伟大 | 李肖遥链接:https://itexp.blog.csdn.net/article/details/100048461前言ARM官网进行了较大的改版,原来很多老工具可以免费下载(付费使用),但是改版后需要有购买凭证才可以下载!部分旧工具(补丁)的具体下载地址为 https://silver.arm.com ,最新的工具在官网还是非常...

李肖遥的专栏 3514

C++开发的掷骰子游戏

C++开发的掷骰子游戏 lkmdlkfl fklkd ;lfk

骰子游戏(C++课程设计)

骰子游戏(C++课程设计),完整的文档,代码描述

C++实现N个骰子的点数算法

主要介绍了C++实现N个骰子的点数算法,用两种方法实现了该功能,是非常实用的技巧,需要的朋友可以参考下

linux下用RVDS4.0进行裸机开发

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7012114 为什么选择RVDS开发ARM?很简单,因为ARM最懂ARM!! 因为RVDS是基于eclipse的,故要先装java和eclipse才行(我猜的,我电脑本来就有eclipse,没有缺省eclipse情况下试过)。下载RVDS_4.0_PRO.tgz放到

int64Ago的专栏 5322

RVDS4.0建立工程

1.打开RVDS4.0 选择工程目录,建议不要使用中文路径.   2. 点击右边的那个图标进入工程界面. 3. 点击那个箭头选择RealView Project开始新建工程. 4. 填写工程名称, 5.点击NEXT到下面这个界面,选择CPU,Bare ARM Cores-> ARM1176JZF-S 6.选择浮点协处理器,

与其用泪水悔恨昨天,不如用汗水拼搏今天 1万+

RVDS编译高效代码 RVDS compile efficient code

获得RVDS3.0_586,这是什么呢,经过查找到如下文章。 https://blog.csdn.net/sergeycao/article/details/5968410 ARM公司开发的编译工具从诞生一刻起,就成为业界针对ARM处理器最有效率的工具,因为它是总结了无数经验技巧,由ARM处理器的开发者ARM公司推出的开发工具。而许多前人的经验技巧就隐藏在编译器的某个角落里,等待着你去发现并加以利用。 本文就将与大家分享一些鲜为人知,但却可能使你大吃一惊的ARM编译、链接工具使用方法。 1..

thanklife的专栏 706

常见的ARM集成开发环境

1. ARM SDT: 是ARM公司为方便用户在ARM芯片上进行应用软件开发而推出的一整套开发工具。到ARM SDT 2.5.1,ARM宣布推出ARM ADS1.0取代了ARM SDT,不再对ARM SDT进行维护。ARM SDT支持的ARM处理器最高到包括ARM9在内的所有ARM处理器。配合Angel驻留程序和JTAG仿真器,用户使用可方便的使用ARM SDT进行应用程序的开发。2. ARM

嵌入式系统与多媒体通信技术 7158

RVDS2.2下载与安装

一、我们将rvds2.2的压缩包(下载地址:http://115.com/file/aq6lhqym)解压,进入目录,点击setup.exe让他安装就好了,一直安装下去,到License Wizard,这边我们先不管它。     二、将文件夹中的Crack文件夹拷贝到你的安装目录下,进入文件夹,双击运行keygen.exe,然后点击Generate来生成license.dat。    三、在C

zzc89522的专栏 7854
下一篇: zoj1002 FireNet 火力网 C++ 二分图匹配
broxin
博客等级 码龄13年 41粉丝 96原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值