这虽然是中文题,然而没看懂,不懂的地方,就是在曼哈顿距离这块,网上搜索了一下,写了个程序,是测试曼哈顿距离的。
曼哈顿距离:两点(x1,y1)(x2,y2)的曼哈顿距离为|x1-x2|+|y1-y2|
测试代码:
#include
这是根据测试样例的背景写的,i,i1是所给坐标,最后输出*的地方,就是他对应的曼哈顿距离 (由图可知:曼哈顿距离就是以这个点为中心的菱形)
AC代码:
#include #include #include #include #include #define N 110#define M 200using namespace std;int n,m,a[N];int dp[N][M][M],cnt,num[M],sum[M];///dp[i][j][k] 表示第i行的j状态 i-1行的k状态 的最优解bool ok(int x){ return (x&(x<<2))||(x&(x<<2));///第x-2个和x+2个位是否有人, // 有的话就不符合条件}int getsum(int x) ///1的个数,即放多少个兵{ int sum=0; while(x) { if(x&1)sum++; x>>=1; } return sum;}void init(){ cnt=0; for(int i=0; i<(1< =1;i--)// {// if (i%4==0)// printf(" ");// printf("%d ",two[i]);// }puts("");//}int main(){#ifndef ONLINE_JUDGE freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);#endif // ONLINE_JUDGE while(~scanf("%d%d",&n,&m)) { memset(a,0,sizeof a); for(int i=0; i >1)&num[j]))continue; //i-1行 int Max=-1; for(int l=0; l >1)&num[k]))continue; Max=max(Max,dp[i-1][k][l]); } dp[i][j][k]=Max+sum[j]; } } } int Max=-1; for(int i=0; i