hdu 4584 building-bridge 暴力的題,怎麼暴力怎麼幹。。2013 ACM-ICPC杭州賽區全國邀請賽——題目重現

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章