这是一篇如何让你驾驭模拟暴力题的文章
话不多说我们正片开始
啥事暴力?
本质就是把所有可能的情况一个一个比对,看看符不符合要求。比如在数组里找出1。我们就遍历数组一个一个比较,从第一个到最后一个,如果找到了直接break。就这么简单。缺点是要一个一个比,太慢了,如果数组是升序那就废掉(点名表扬二分)。
简单的暴力
就是写个for循环或者很多层for循环,把所有情况枚举出来判断
- 暴力枚举
一般都叫穷举,我叫习惯了。 可以解决简单的小学问题如鸡兔同笼。不用你想算式还是方程,直接把所有数列出来,逐个比对。
比如:一个笼子里面有鸡若干只,兔若干只。共有头50个,共有腿160条。鸡兔都有的情况下,求鸡兔各多少只?
相信你口算都能算出,但是用暴力的办法怎么写呢?首先看条件。首先看问题。问你鸡兔多少只。那就枚举只数。看共有50头,那么兔子和鸡总数不超过50,也就是说我们枚举的范围不大于50。看共有160条腿。那就再枚举到160腿的时候break掉
此外我们还必须知道兔腿=兔子数×4 鸡腿=鸡数×2
那就好办了,外层循环枚举兔子只数,内层枚举鸡数,i枚举到50,而j因为总数不能超过50,所以只能枚举到50-i,到i×4+j×2==160的时候返回答案并break
下面是c++代码
pair<int,int> chickenAndRabbit(int sum_head,int sum_feet)//为了方便,这里使用函数的形式写
{
for (int i = 0; i <= sum_head; i++)
{
for (int j = 0; j <= sum_head - i; j++)
{
if (i * 4 + j * 2 == 160)
{
return make_pair(i, j);
}
}
}
}
没有问题
- 一般暴力
接下来会用一点数学知识。这种暴力很普通,就像我刚刚的例子,有较为简单的在数组里找出奇数个数的,以及相对难一点判断这个数是否是质数。
首先确定思路,是否适合暴力?怎么暴力?等等。最后就可以优化算法了。
就拿判断质数为例。
首先,我们很容易想到列举1-n之间(2~n-1)的所有数,然后n÷i,如果余0则不是素数,直接return(break),否则列举下一个直到枚举完。
下面是c++代码
为了方便还是写成函数,欸嘿
bool isPrime(int n)
{
for (int i =