UVa 11101 - Mall Mania

来源:互联网 发布:java 多语言 国际化 编辑:程序博客网 时间:2024/04/29 13:46

题目:给你平面上的两个图形的有序点集表示,求两图形的哈密顿距离(|x|+|y|)。

分析:搜索、最短路。利用bfs求解即可,可利用缩小边界优化效率,dbfs或者A*可能效率更高。

注意:数据范围是0-2000,2001个点,小心RE。

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;typedef struct nodep {int x,y,s;}point;point p[4008004];point q[4008004];point Q[4008004];int maps[2005][2005];int step[2005][2005];int d[4][2] = {0,1,0,-1,1,0,-1,0};int bfs( int n, int m, int Lx, int Ly, int Hx, int Hy ){for ( int i = Lx ; i <= Hx ; ++ i )for ( int j = Ly ; j <= Hy ; ++ j )step[i][j] = 4008004;int move = 0,save = 0;for ( int i = 0 ; i < n ; ++ i ) {Q[save ++] = p[i];step[p[i].x][p[i].y] = 0;}for ( int i = 0 ; i < m ; ++ i )step[q[i].x][q[i].y] = -1;while ( move < save ) {point New,now = Q[move ++];for ( int i = 0 ; i < 4 ; ++ i ) {New.x = now.x + d[i][0];New.y = now.y + d[i][1];New.s = now.s + 1;if ( New.x >= Lx && New.x <= Hx && New.y >= Ly && New.y <= Hy ) {if ( step[New.x][New.y] == -1 ) return New.s;if ( step[New.x][New.y] > now.s + 1 ) {step[New.x][New.y] = now.s + 1;Q[save ++] = New;}}}}return -1;}int main(){int n,m;while ( scanf("%d",&n) && n ) {int lx = 2002,ly = 2002,hx = 0,hy = 0;for ( int i = 0 ; i < n ; ++ i ) {scanf("%d%d",&p[i].x,&p[i].y);p[i].s = 0;if ( lx > p[i].x ) lx = p[i].x;if ( ly > p[i].y ) ly = p[i].y;if ( hx < p[i].x ) hx = p[i].x;if ( hy < p[i].y ) hy = p[i].y;}scanf("%d",&m);for ( int i = 0 ; i < m ; ++ i ) {scanf("%d%d",&q[i].x,&q[i].y);q[i].s = -1;if ( lx > q[i].x ) lx = q[i].x;if ( ly > q[i].y ) ly = q[i].y;if ( hx < q[i].x ) hx = q[i].x;if ( hy < q[i].y ) hy = q[i].y;}printf("%d\n",bfs( n, m, lx, ly, hx, hy ));}return 0;}

0 0
原创粉丝点击