搜索(枚举and DFS)

1, 枚举:

  顾名思义,就是暴力(对于我来说),毕竟暴力出奇迹嘛。下面来看一道题(水题,想必大家都会)

给定一个式子,求出ABCABC满足以下条件:
AB*A=CCC

这一道题显然很简单。我们先用数学方法来做一遍(是很有必要的)

基础分析

C=111*c,而111=3*37

所以CCC=C*3*37

AB一定是3774中的一个(而且满足要74C还一定是2的被数),因为37不可能是右边分解质因数的结果(明显是一个一位数),所以37只能是AB分解质因数的结果,而AB又是两位数,所以其结果一定是这两个数。

A一定是3的倍数,因为CCC分解质因数有3,而AB不可能有3.

冷静分析

AB可以得知,A只有是37.A又是3的倍数,所以A3b就只能是7.

在算一下就是3*37=111.

算数思想是不是太麻烦了,直接打下来不就好了

代码如下

#include<bits/stdc++.h>

Using namespace std;

Int main()

{

  For(int a=1;a<=9;a++)

For(int b=1;b<=9;b++)

  For(int c=1;c<=9;c++)

     If(a*((a*10)+b)==c*111)cout<<a<<b<<c;

Return 0;

}

是不是很草率。

就这么简单。

下面在来模拟几道题,来做一下

1,A*B=CD

2,AA*BB=CCDD

(代码我就不发了,想必大家都会)

这就是枚举

我们来看一道题

这道简化很多才打出来的

课程分数=xa\%+yb\%+z*(100-a-b)\%已知想xayb。要让课程分高于60z至少要多少?如果无答案,就输出“poor little A!”;

很多人会问,这是枚举?

对,这就是枚举。

可是这明明是用数学方法做的呀。

我们来用数学方法来试一试

#include<bits/stdc++.h>

using namespace std;

int main()

{

int t;cin>>t;double x,y,a,b,o;

for(int i=1;i<=t;i++)                                 

{                                                      cin>>x>>y>>a>>b;

o=60-x*a/100-y*b/100+z*(100-a-b)/100;

if(o>=0&&o<=100)cout<<o;

                 else cout<<poor little A!;  

return 0;}

你们想说就是这样对吧;

我要说一句,

浮点型是很难懂的,

在我以后发的《有趣的浮点型》里就会提到

那怎们办,有一种很好的方法。

看一下我的程序就知道了

#include<bits/stdc++.h>

using namespace std;

int main()

{

int t;cin>>t;int x,y,a,b,o;

for(int i=1;i<=t;i++)                                 

{                                                      cin>>x>>y>>a>>b;

o=6000-x*a-y*b+z*(100-a-b);

if(o/100>=0&&o/100<=100)cout<<o;

                 else cout<<poor little A!;  

return 0;}

是不是一个绝妙的方法?

可是你们会问,

这还是没有用到枚举呀,

还会出现一个问题:ab有没有可能是0

想到没有?

所以还是用上枚举吧

标程:

#include<bits/stdc++.h>

using namespace std;

int main()

{

int t;cin>>t;double x,y,a,b,o;

for(int i=1;i<=t;i++)                                 

{                                                    

  cin>>x>>y>>a>>b;

  for( o=0;o<=101;o++)

  if(x*a+y*b+o*(100-a-b)>=6000)break;

if(o<=100&&o>=0)cout<<int(o)<<endl;

            else  cout<<"poor little A!"<<endl;}

return 0;}

2DFS

  dfs,其实就是一种递推(对于我来说),

概念:举一个栗子

      我从教室到厕所(快憋不住了!!!十万火急!!!),我会先找准一个方向走到尽头,发现不是,就退回来(1步),在找一个方向......当所有的方向都找完的时候(已经退回1步的时候),就再退回一步,继续走。

其实DFS没什么好讲的

基本框架:

1. void dfs(int deep, State curState)  

2. {  

3.     if (deep > Max) //深度达到极限  

4.     {     

5. if (curState == target) //找到目标  

6.         {  

7.             //...  

8.         }  

9.     }  

10.     else  

11. {  

12.     for (i = 1; i <= totalExpandMethod; i++)  

13.     {  

14.         dfs(deep + 1,   

15.                       expandMethod(curState, i));  

16.     }  

17. }  

18. }  

是不是有点简单了

这就是DFS和枚举

谢谢

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_40669010/article/details/79285087