1、求多边形的面积:
(1)已知顶点坐标:
公式:s=0.5*abs((x1 * y2-x2 *y1)+(x2 *y3-x3 *y2)+、、、+(xn-1 *yn-xn *yn-1))
这个公式不管是凹凸边形或者规则的,不过如果是顺时针输入点就是负的,逆时针就是正的。
例题:http://acm.hdu.edu.cn/showproblem.php?pid=2036`
#include<stdio.h> double a[106][2]; int main() { int n; while(scanf("%d",&n),n!=0) { for(int i=0;i<n;i++) scanf("%lf%lf",&a[i][0],&a[i][1]); a[n][0]=a[0][0]; a[n][1]=a[0][1]; double sum=0; for(int i=0;i<n;i++) sum+=(a[i][0]*a[i+1][1]-a[i+1][0]*a[i][1]); sum=sum/2; printf("%.1lf\n",sum); } return 0; }
2、博弈算法:
(1) 巴什博奕:只有一堆n个物品,两个人轮流从中取物,规定每次最少取一个,最多取m个,最后取光者为胜。
代码:
#include<stdio.h> int main() { int n,m; while(~scanf("%d%d",&n,&m)) { if(n%(m+1)==0) printf("后手胜\n"); else printf("先手胜\n"); } return 0; }
(2) 威佐夫博弈:有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利。若两堆物品的初始值为(x,y),且x<y,则另z=y-x;记w=(int)[((sqrt(5)+1)/2)*z ];若w=x,则先手必败,否则先手必胜。
代码:
#include<stdio.h> #include<math.h> int main() { int n,m,k,t,a; while(scanf("%d%d",&n,&m)!=EOF){ if(n<m){ a=m; m=n; n=a; } k=n-m; t=(int)(((sqrt(5)+1)/2)*k); if(t==m) printf("0\n"); else printf("1\n"); } return 0; }
(3)尼姆博弈:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。
结论:把每堆物品数全部异或起来,如果得到的值为0,那么先手必败,否则先手必胜。
代码:
#include<stdio.h> int main() { int n,m,k,temp,i; while(scanf("%d",&k)!=EOF){ temp=0; for(i=1;i<=k;i++){ scanf("%d",&n); temp^=n; } if(temp==0) printf("No\n"); else printf("Yes\n"); } return 0; }