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