HDU ACM 4584 Building bridges->简单水题

题意:H表示H国的岛,C表示C国的岛,O表示海。一个H岛与C岛的距离为|X1-X2|+|Y1-Y2|。要在一个H岛与C岛之间建一个桥,求距离最小。距离最小有多组解时,依次H岛的X坐标最小,Y坐标最小,然后是C岛的X坐标最小,Y坐标最小的解。预处理把两个国家的岛分别保存,然后两两求最短距离即可,这里无需排序,因为下标就是有序的。

#include<iostream>
#include<cmath>
using namespace std;

struct node
{
	int x,y;
};

node C[1605],H[1605]; //C岛的点,H岛的点
int nc,nh;

int main()
{
	int n,m,x1,y1,x2,y2,min,i,j;
	char ch;

	while(scanf("%d%d",&n,&m)==2 && n+m)
	{
		nc=nh=0;
		for(i=0;i<n;i++)
		{
			getchar();
			for(j=0;j<m;j++)
			{
				scanf("%c",&ch);
				if(ch=='C')
				{
					C[nc].x=i;
					C[nc++].y=j;
				}
				else if(ch=='H')
				{
					H[nh].x=i;
					H[nh++].y=j;
				}
			}
		}
		min=100000;
		for(i=0;i<nh;i++)
			for(j=0;j<nc;j++)  //无需排序,读入时下标就是有序的
				if(min>abs(H[i].x-C[j].x)+abs(H[i].y-C[j].y))
				{
					x1=H[i].x;
					y1=H[i].y;
					x2=C[j].x;
					y2=C[j].y;
					min=abs(H[i].x-C[j].x)+abs(H[i].y-C[j].y);
				}
		printf("%d %d %d %d\n",x1,y1,x2,y2);
	}
	return 0;
}


你可能感兴趣的:(编程,C++,c,算法,ACM)