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