标签:
http://acm.hdu.edu.cn/showproblem.php?pid=4740
2 0 0 0 0 1 2 4 0 1 0 3 2 0 0
-1 1 3
/** hdu4740 搜索(会爆栈,需要手动开辟) 题目大意:有一头驴和一只虎,二者在一个n*n的棋盘里乱跑,判断是否有一个时间点二者跑到同一个格子上。至于他们跑到方式,还是看题吧 解题思路:两次dfs用两个vector分别存驴和虎在i时间所处的位置点,找vector1的i和vector2的i里面的坐标第一重合的就行了 */ #pragma comment(linker, "/STACK:10240000000000,10240000000000") #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> #include <vector> using namespace std; vector <pair<int,int> > vec,vec1; bool flag[1005][1005]; int n; void dfs(int x,int y,int r,int num)///驴向左 { flag[x][y]=1; vec.push_back(make_pair(x,y)); if(r==1) { if(flag[x+1][y]==0&&x+1<=n) { dfs(x+1,y,r,num++); } else { if(flag[x][y-1]==0&&y-1>0) { dfs(x,y-1,2,num++); } } } else if(r==2) { if(flag[x][y-1]==0&&y-1>0) { dfs(x,y-1,r,num++); } else { if(flag[x-1][y]==0&&x-1>0) { dfs(x-1,y,3,num++); } } } else if(r==3) { if(flag[x-1][y]==0&&x-1>0) { dfs(x-1,y,r,num++); } else { if(flag[x][y+1]==0&&y+1<=n) { dfs(x,y+1,0,num++); } } } else { if(flag[x][y+1]==0&&y+1<=n) { dfs(x,y+1,r,num++); } else { if(flag[x+1][y]==0&&x+1<=n) { dfs(x+1,y,1,num++); } } } } void dfs1(int x,int y,int r,int num)///虎向右 { flag[x][y]=1; vec1.push_back(make_pair(x,y)); if(r==1) { if(flag[x+1][y]==0&&x+1<=n) { dfs1(x+1,y,r,num++); } else { if(flag[x][y+1]==0&&y+1<=n) { dfs1(x,y+1,0,num++); } } } else if(r==2) { if(flag[x][y-1]==0&&y-1>0) { dfs1(x,y-1,r,num++); } else { if(flag[x+1][y]==0&&x+1<=n) { dfs1(x+1,y,1,num++); } } } else if(r==3) { if(flag[x-1][y]==0&&x-1>0) { dfs1(x-1,y,r,num++); } else { if(flag[x][y-1]==0&&y-1>0) { dfs1(x,y-1,2,num++); } } } else { if(flag[x][y+1]==0&&y+1<=n) { dfs1(x,y+1,r,num++); } else { if(flag[x-1][y]==0&&x-1>0) { dfs1(x-1,y,3,num++); } } } } int main() { while(~scanf("%d",&n)) { if(n==0)break; int x,y,r; scanf("%d%d%d",&x,&y,&r); memset(flag,0,sizeof(flag)); vec.clear(); dfs(x+1,y+1,r,0); int m=vec.size(); /*for(int i=0;i<m;i++) { printf("%d %d\n",vec[i].first,vec[i].second); }*/ scanf("%d%d%d",&x,&y,&r); memset(flag,0,sizeof(flag)); vec1.clear(); dfs1(x+1,y+1,r,0); int m1=vec1.size(); /*for(int i=0;i<m1;i++) { printf("%d %d\n",vec1[i].first,vec1[i].second); }*/ bool cnt=0; for(int i=0; i<m&&i<m1&&cnt==0; i++) { if(vec[i].first==vec1[i].first&&vec[i].second==vec1[i].second) { x=vec[i].first-1; y=vec[i].second-1; cnt=1; } } if(cnt==0) { if(m<m1) { for(int i=m; i<m1; i++) { if(vec[m-1].first==vec1[i].first&&vec[m-1].second==vec1[i].second) { x=vec1[i].first-1; y=vec1[i].second-1; cnt=1; } } } else { for(int i=m1; i<m; i++) { if(vec[i].first==vec1[m1-1].first&&vec[i].second==vec1[m1-1].second) { x=vec[i].first-1; y=vec[i].second-1; cnt=1; } } } } if(cnt==0) printf("-1\n"); else printf("%d %d\n",x,y); } return 0; }
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/45042557