UVALive 6693 - Flow Game
2015-11-14 16:17
357 查看
6693 - Flow Game
题意:给出两对颜色不同的点在边界上,颜色相同的点沿格子相连,求总长最小,如果两对点相连有交点则为-1
在图中可知,如果没有相交则一定有最短的路可连,因为在边界上的点相连的最短的路有两条,对于不相交的连线一定成立。那么就只要找是否有相交就好了。
题意:给出两对颜色不同的点在边界上,颜色相同的点沿格子相连,求总长最小,如果两对点相连有交点则为-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"); } }
相关文章推荐
- hiho刷题日记——第十三天最近公共祖先·一
- linux下解压命令大全
- Drawable和Bitmap相互转换
- delegate
- Android代码强制区分规范
- 从零开始学C++之STL(一):STL六大组件简介
- 费劲心思完成了+ 点击查询之后实现页面不可操作,等待查询,几秒后返回结果页面
- ios之动画效果
- 应用程序开发--所用过的技术与工具介绍(一)
- 并发用户数与TPS之间的关系
- C++标准模板库 迭代器 iterator 详解(二)
- C++标准模板库 迭代器 iterator 详解(一)
- 浅析OC语言
- 二维插值
- 探索适合中国国情的社会主义道路
- 表单选择器
- 程序员编程艺术第二章
- ios面向切面AOP(上) Objective-c版本
- Xlistview的滚动控制
- VC++中从txt文本中读取数据并且存到二维数组中