poj Whac-a-Mole

思路是自己想的,wa的代码也是自己写的,看了题目上的discuss,还是一直wa,后来看了别人的代码,觉得那叫一个简便啊!然后就又自己写了一遍调试了好久过了!自己原来wa的代码还是没有找到错啊!想起来了数据库老师的话:现在你们做什么都是初级阶段,做题是不要想着自己一定要用自己的方法做出来,而是要看别人的写的优的,脑袋里要记录的是好的简便的,等积累到一定程度了再自己想着怎样去优化和提高!!似乎我转述的有点啰嗦了!下面是ac的代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
using namespace std; 
#define rep(i,n) for(i=0; i<(n); i++)
#define reph(i,n,m) for(i=(n); i<=(m); i++)//正循环的
#define repd(i,n,m) for(i=(n); i>=(m); i--) //负循环的 
#define fab(a) (a)>0?(a):0-(a)
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define ll long long
#define arc(a) (a)*(a)
#define inf 10000000   //最大值的
#define exp 0.0000001     //浮点型的
#define N   22  //记录开的数组
int map[11][N+10][N+10];
int dp[11][N+10][N+10];
int n,d,m;
int gcd(int a,int b)
{
    if(b==0)
     return a;
    else
    return gcd(b,a%b); 
}
int fun(int x1,int y1,int x2,int y2,int t)
{
    int fa=x2-x1;
    int fb=y2-y1;
    int temp=gcd(max(fab(fa),fab(fb)),min(fab(fa),fab(fb)));
    if(temp!=0)
    {
    fa=fa/temp;
    fb=fb/temp;
    }
    else//为0代表两点是重合的 
    {
        return map[t][x1][y1];
    }
    int i,j,sum=0;
	i=x1;
	j=y1;
    for(i=x1,j=y1; !(i==x2 && j==y2); i+=fa, j+=fb)
    { 
         if(map[t][i][j]==1)
          sum++; 
    }
    sum+=map[t][x2][y2];
    return sum;
}
int main()
{
    int i,x,y,t,maxt,i1,j1,i2,j2;
    while(scanf("%d%d%d",&n,&d,&m))
    {
        if(n==0 && m==0 && d==0)
          break;
        memset(dp,0,sizeof(dp));
        memset(map,0,sizeof(map));
        maxt=0;
        reph(i,1,m)
        {
            scanf("%d%d%d",&x,&y,&t);
            map[t][x+d][y+d]=1;//防止出现负的 
            maxt=max(t,maxt);
        } 
        n+=d+d;
        reph(i,1,maxt)
        {
            reph(i1,0,n-1)
             reph(j1,0,n-1)
             {
                    reph(i2,0,n-1)
                      reph(j2,0,n-1)
                      {
                          if(arc(i2-i1)+arc(j2-j1)>arc(d))
                           continue;
                          dp[i][i1][j1]=max(dp[i][i1][j1],dp[i-1][i2][j2]+fun(i2,j2,i1,j1,i));//在i时刻的     
                      }
                } 
          reph(i1,0,n-1)
            {
                reph(j1,0,n-1)
                 printf("%d ",dp[i][i1][j1]);
                 printf("\n");
            }
        } 
        int Max=0;
        reph(i1,0,n-1)
         reph(i2,0,n-1)
          Max=max(Max,dp[maxt][i1][i2]);
          printf("%d\n",Max);
    } 
    return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淡定的小Y

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值