POJ2054--Triangle

今 天上acm,掌握的不好,写这篇的时候觉得很不好意思,因为这是别人做的,我只是在理解,他大体的思路和我一样,可是我却老是wrong answer。。。伤感啊~~Triangle

这题是学长教我们的,不过我做的不好,这题是pick定理的应用:pick定理就是A=i+d/2-1;(A:表示的是面积,i:落在网格的点的个数,d:是落在线上的点的个数)。

思路:先求出三角形的面积,已知三角形的三点求面积:s=x0*y1+x1*y2+x2*y0-x1*y0-x2*y1-x0*y2;再求落在边上的整点,用求两个数之间差值的最大公约数的方法求出落在边上的点,结果是i=A+1-d/2;

这是我上网搜到的,参考别人的,现在,我知道了最好的方法就是自定义函数,自定义函数可以分块调用,减少错误:

#include<stdio.h>
#include<math.h>
int x[3],y[3];
int gys(int a,int b)
{
 if(a==0)
  return b;
 if(b==0)
  return a;
 if(a>=b)
  return gys(b,a%b);
 else
  return gys(a,b%a);//求最大公约数的自定义函数;
}
int p(int a)
{
 if(a<0)
  a=-a;
 return a;//负数变正数。
}
int main()
{
 int b,s,i;
 while(scanf("%d%d%d%d%d%d",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2])!=EOF)
 {
  if(x[0]==0&&y[0]==0&&x[1]==0&&y[1]==0&&x[2]==0&&y[2]==0)
   break;
  s=x[0]*y[1]+x[1]*y[2]+x[2]*y[0]-x[1]*y[0]-x[2]*y[1]-x[0]*y[2];
  if(s<0)
   s=-s;
  b=gys(p(x[0]-x[1]),p(y[0]-y[1]))+gys(p(x[1]-x[2]),p(y[1]-y[2]))+gys(p(x[2]-x[0]),p(y[2]-y[0]));
  i=1+(s-b)/2;
  printf("%d\n",i);
 }
}

今天上课有点小吃力,觉得好多东西都要学,好多东西都不会,今天还学了动态规划,R3要加油了哦~嘿嘿~大笑相信付出了,就一定会有进步~~嘿嘿~~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
POJ1753题目为"Flip Game",题目给出了一个4x4的棋盘,每个格子有黑色或白色,每次翻转一个格子会同时翻转它上下左右四个格子的颜色,目标是把整个棋盘都变为同一种颜色,求把棋盘变成同种颜色的最小步数。 解题思路: 一般关于棋盘变色的题目,可以考虑使用搜索来解决。对于POJ1753题目,可以使用广度优先搜索(BFS)来解决。 首先,对于每个格子,定义一个状态,0表示当前格子是白色,1表示当前格子是黑色。 然后,我们可以把棋盘抽象成一个长度为16的二进制数,将所有格子的状态按照从左往右,从上往下的顺序排列,就可以用一个16位的二进制数表示整个棋盘的状态。例如,一个棋盘状态为: 0101 1010 0101 1010 则按照从左往右,从上往下的顺序把所有格子的状态连接起来,即可得到该棋盘的状态为"0101101001011010"。 接着,我们可以使用队列来实现广度优先搜索。首先将初始状态加入队列中,然后对于队列中的每一个状态,我们都尝试将棋盘上的每个格子翻转一次,生成一个新状态,将新状态加入队列中。对于每一个新状态,我们也需要记录它是从哪个状态翻转得到的,以便在得到最终状态时能够输出路径。 在搜索过程中,我们需要维护每个状态离初始状态的步数,即将该状态转换为最终状态需要的最小步数。如果我们找到了最终状态,就可以输出答案,即最小步数。 代码实现:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R3

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值