种花小游戏 随机化搜索

植物大战僵尸这款游戏中,还有个特别有意思的赚钱方式——种花(能长金币的花)。
种出来的金币需要玩家点击才能得到,或者,玩家可以购买一只蜗牛来帮助捡金币。然而,蜗牛爬得慢是众所周知的。所以,场上有若干金币时,蜗牛总是喜欢以最少的行程来捡走所有的金币。
现在告诉你场上n个金币所在位置的坐标,以及蜗牛所在位置,让你求出蜗牛捡走所有金币的最小行程。

 

比较神奇,数据量是16,dfs可以过;随机化搜索,很稳定(所有的点都相同的时间);

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<ctime>
 4 #include<cstdlib>
 5 #include<cmath>
 6 using namespace std;
 7 #define up(i,p,n) for(int i=p;i<=n;i++)
 8 #define down(i,n,p) for(int i=n;i>=p;i--)
 9 namespace OI{
10     const int maxn=20,inf=100000000;
11     int n,a[maxn][2],q[maxn];
12     double d[maxn][maxn];
13     void swa(int i,int j){
14         for(;i<=j;i++,j--){
15             swap(q[i],q[j]);
16         }
17     }
18     double slove(){
19         up(i,1,100){
20             int x=rand()%n+1;
21             int y=rand()%n+1;
22             if(x==n)x=n-1;if(y==n)y=n-1;
23             swap(q[x],q[y]);
24         }
25         up(i,1,n)up(j,i+1,n-1)
26         if(d[q[i]][q[i+1]]+d[q[j-1]][q[j]]>d[q[i]][q[j-1]]+d[q[i+1]][q[j]])swa(i+1,j-1);
27         double t=0;
28         up(i,1,n-1)t+=d[q[i]][q[i+1]];
29         return t;
30     }
31     int squ(int x){return x*x;}
32     void init(){
33         srand(time(0));
34         scanf("%d",&n);n++;
35         up(i,1,n)scanf("%d%d",&a[i][0],&a[i][1]);
36         up(i,1,n)up(j,1,n)
37                 d[i][j]=sqrt(1.0*squ(a[i][0]-a[j][0])+squ(a[j][1]-a[i][1]));
38         //up(i,1,n)up(j,1,n)printf("%d %d %.2lf\n",i,j,d[i][j]);
39         up(i,1,n)q[i]=i;
40         double ans=(double)inf;
41         up(i,1,50000){
42             double t=slove();
43             if(t<ans)ans=t;
44         }
45         printf("%.2lf\n",ans);
46     }
47 }
48 int main(){
49     //freopen("1.in","r",stdin);
50     //freopen("1.out","w",stdout);
51     OI::init();
52     return 0;
53 }
View Code

 

转载于:https://www.cnblogs.com/chadinblog/p/5894217.html

4 个人甲乙丙丁在一起玩一副扑克纸牌,每张纸牌按照数字计分,不同色的相同数字的纸牌分值一样。 其 1-10 各种花色的纸牌分别为 1-10,J、Q、K 分别被记为 11,12,13,大王和小王分别记为 20。四种花 色(方片,梅、红桃、黑桃)分别被记为 A、B、C、D。如红桃 K 表示为 13C,分值为 13;方片 5 表示 为 5A,分值为 5。大王表示为 20K,分值为 20,小王表示为 20Q,分值为 20,54 张纸牌叠在一起倒扣在 桌子上。 游戏过程如下: 1. 洗牌:54 张纸牌随机顺序组合。 2. 4 人排序:随机产生 4 人的拿牌顺序,出牌顺序与拿牌顺序相同。第一个人拿牌,即第一个人出牌。 3. 4 人排序后,两两组队,按照顺序第 1 人和第 3 人组成 1 队,第 2 人和第 4 人组成 1 对。 4. 分牌:按拿牌顺序每人轮流拿牌,每人拿 13 张纸牌,最后两张纸牌留在桌面。 5. 信息:每个人不知道其他人的牌,也不知道留在桌面上的牌,可以获得的信息包括自己持有的牌和 4 个人出过的牌。队内的成员可以在每一轮沟通出牌的策略。 6. 出牌:从第一个拿牌的人开始出牌(可以选择最大获胜机会的策略),每一轮 4 人出牌,然后比大 小,拥有牌最大的人获取当前轮次的 4 张牌。出过的牌后面不可以再出。大小判定规则,纸牌分值 (大) > 纸牌分值(小),相同纸牌分值,按照黑桃>红桃>梅>方片的顺序判定大小。 7.判定胜负:每个人手的牌的分值总和为每个人的得分,每队的得分为两个人得分的和,得分最大的 队伍者获胜,如果两队得分相同,则平局。请用C#语言编写代码
07-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值