poj Whac-a-Mole

来源:互联网 发布:淘宝联盟订单 编辑:程序博客网 时间:2024/05/12 19:47

思路是自己想的,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;} 


原创粉丝点击