唉 真是越来越弱了 这个状态还怎么搞ACM啊??? 很水的模拟题居然没想到!
题目大意:在一张图上有n*m个点,每个点上有一个值k(1<=k<=9),定义2个点之间的运算为f(a,b)=abs(x[a]-x[b])+abs(y[a]-y[b]).输入s个值为c[i]的点,问从值为任一值为c[i]的点开始移动到地图上任一值为c[i+1]的点,其中使得这两点的f运算最大的f的值为多少?
题目链接:http://codeforces.com/problemset/problem/366/E
题解就不说了,看代码应该可以看懂。
#include<stdio.h>
int min(int x, int y){
if (x>y) return y;
else return x;
}
int max(int x, int y){
if (x>y) return x;
else return y;
}
int main(void){
int n,m,k,s,i,j,u,f[10][2],g[10][2],ans=0;
scanf("%d%d%d%d",&n,&m,&k,&s);
for (i=1;i<=k;i++) {
g[i][0]=n+m;g[i][1]=n-1;
f[i][0]=0;f[i][1]=1-m;
}
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
scanf("%d",&u);
f[u][0]=max(i+j,f[u][0]);g[u][0]=min(i+j,g[u][0]);
f[u][1]=max(i-j,f[u][1]);g[u][1]=min(i-j,g[u][1]);
}
}
for (u=0;u<s;u++,n=m){
scanf("%d",&m);
if (u) ans=max(ans,max(max(f[n][0]-g[m][0],f[m][0]-g[n][0]),max(f[n][1]-g[m][1],f[m][1]-g[n][1])));
}
printf("%d",ans);
return 0;
}