您的位置:首页 > 其它

UVALive 6693 - Flow Game

2015-11-14 16:17 357 查看
6693 - Flow Game

题意:给出两对颜色不同的点在边界上,颜色相同的点沿格子相连,求总长最小,如果两对点相连有交点则为-1

在图中可知,如果没有相交则一定有最短的路可连,因为在边界上的点相连的最短的路有两条,对于不相交的连线一定成立。那么就只要找是否有相交就好了。

/*
2
5
.12..
.....
.....
1....
2....
5
.21..
.....
1....
2....
.....
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
char mp[20][20];
int p1[5][3],p2[5][3];
int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};
int dx1[]={0,1,0,-1};
int dy1[]={1,0,-1,0};
bool vis[10];
int n;
bool mark['5'];
bool f;
bool ok(int x,int y,int d)
{
vis[d]=1;
if(mark[mp[x][y]]==1)
return true;
int xx=x+dx[d];
int yy=y+dy[d];
while(xx<0 || xx>=n || yy<0 || yy>=n){
d=(d+1)%4;
if(vis[d]) f=true;//return true;
if(f) break;
xx=x+dx[d];
yy=y+dy[d];
}
if(f) return true;
if(mark[mp[xx][yy]]==0 && mp[xx][yy]!='.')
return false;
else
if(ok(xx,yy,d))
return true;
return false;
}
bool ok2(int x,int y,int d)
{

vis[d]=1;
if(mark[mp[x][y]]==1)
return true;
//printf("%d %d\n",x,y);
int xx=x+dx1[d];
int yy=y+dy1[d];
while(xx<0 || xx>=n || yy<0 || yy>=n){
d=(d+1)%4;
if(vis[d]) f=true;
if(f) break;
xx=x+dx1[d];
yy=y+dy1[d];
}
// printf("%d %d\n",xx,yy);
//getchar();
if(f) return true;
if(mp[xx][yy]!='.' && mark[mp[xx][yy]]==0)
return false;
else if(ok2(xx,yy,d))
return true;
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
mark['.']=0;
mark['1']=mark['2']=1;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
int c1=0,c2=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(mp[i][j]=='1'){
p1[c1][0]=i;
p1[c1++][1]=j;
}
else if(mp[i][j]=='2'){
p2[c2][0]=i;
p2[c2++][1]=j;
}
}
bool ff;
memset(vis,0,sizeof vis);
mark['1']=0;
mark['2']=1;
f=0;
ff=ok(p1[0][0],p1[0][1],0);
memset(vis,0,sizeof vis);
//printf("1--ff=%d\n",ff);
f=0;
if(ff)
ff=ok2(p1[0][0],p1[0][1],0);
//printf("2--ff=%d\n",ff);
mark['1']=1;
mark['2']=0;
f=0;
memset(vis,0,sizeof vis);
if(!ff){
ff=ok(p2[0][0],p2[0][1],0);
//printf("3--ff=%d\n",ff);
f=0;
memset(vis,0,sizeof vis);
if(ff)
ff=ok2(p2[0][0],p2[0][1],0);
// printf("4--ff=%d\n",ff);
}
if(!ff){
int sx=fabs(p1[0][0]-p1[1][0]);
int sy=fabs(p1[0][1]-p1[1][1]);
int ssx=fabs(p2[0][0]-p2[1][0]);
int ssy=fabs(p2[0][1]-p2[1][1]);
int ans=sx+sy+ssx+ssy+2;
printf("%d\n",ans);
}
else
puts("-1");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: