題目是有一個由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;
}