题目是有一个由H C O组成的n*m的矩形图,要你求图中距离最近的H和C的坐标,其中对于(x1,y1),(x2,y2)距离是 |x1-x2|+|y1-y2|
如果有多解就选H的x最小的若还是有多解的话,就选x最小的同是y也最小,对于C也是这样处理多解的情况
很暴力的方法,就行因为是水题就是来让你爆的
/********* PRO: hdu 4584 TIT: Building bridges DAT: 2013-08-10-13.22 AUT: UKean EMA: [email protected] *********/ #include<cstdio> #include<cstring> #include<iostream> #define INF 1e8 using namespace std; char tu[45][45]; struct point { int x,y; }; int m,n; point tempa,tempb; int inline fabs(int x){return x>0?x:-x;}//取绝对值的函数 int cal(int i,int j,int ii,int jj)//计算2点的距离 { if(tu[ii][jj]==tu[i][j]||tu[ii][jj]=='O') return INF+INF; return fabs(ii-i)+fabs(jj-j); } bool smalldo(int i,int j,int milen)//暴力枚举对于当前的起点H存不存在满足距离等于milen的C { for(int ii=0;ii<m;ii++)//当然得先枚举i最小的 for(int jj=0;jj<n;jj++)//至于j也是从小到的枚举 if(tu[ii][jj]=='C'&&milen==cal(i,j,ii,jj)) { tempb.x=ii; tempb.y=jj; return 1; } return 0; } int main() { while(scanf("%d%d",&m,&n)) { if(m==0&&n==0) break; for(int i=0;i<m;i++) scanf("%s",tu[i]); int milen=INF;//milen是H 和C的最小距离 for(int i=0;i<m;i++)//暴力枚举2点算出最小的距离 for(int j=0;j<n;j++) { if(tu[i][j]=='O') continue; for(int ii=0;ii<m;ii++) for(int jj=0;jj<n;jj++) { if(ii==i&&jj==j) continue; int len=cal(i,j,ii,jj); milen=min(len,milen); } }//找出milen for(int i=0;i<m;i++)//暴力枚举起点H for(int j=0;j<n;j++) if(tu[i][j]=='H') { tempa.x=i;tempa.y=j; if(smalldo(i,j,milen)) i=m,j=n;//找到了答案,强行跳出循环 } printf("%d %d %d %d\n",tempa.x,tempa.y,tempb.x,tempb.y); } return 0; }