The Donkey of Gui Zhou
原题地址
题意很简单就是驴和老虎在方格中跑,跑的方式:径直跑,若遇到边界或之前走过的点则转向,驴向右转,虎向左转,若转向后还不能跑则一直呆着不动,
问题就是:他们是否会相遇,会输出相遇坐标,不会输出-1
可以直接暴力模拟,也可以深搜做,我一开始深搜没搞明白
后来看别人代码,才把自己关于驴子和虎的在同一个格子第二次无法转的条件写明白啦
附上代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <iomanip>
#include <string.h>
//#include <bits/stdc++.h>
#define INF 999999999
//#include <iomanip>
using namespace std;
#define ll long long
#define boost ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
int ex1,ex2 , ey1 , ey2;
int f1=0 , f2=0 ,flag=1;
int n , d1 ,d2 ,r1 ,r2;
int visx[1010][1011]={0},visy[1011][1011]={0};
int dp[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(int a , int b , int r1, int aa , int bb , int r2){
if(a==aa&&b==bb){
cout<<aa<<" "<<bb<<endl;
flag=0;
return ;
}
int x1,x2,y1 ,y2 ;
x1 = a, x2 = aa, y1 =b , y2 =bb;
visx[a][b]=1,visy[aa][bb]=1;
if(f1&&f2)
{
return ;
}
if(!f1) {
if(a+dp[r1][0]>=n||b+dp[r1][1]>=n||a+dp[r1][0]<0||b+dp[r1][1]<0||visx[a+dp[r1][0]][b+dp[r1][1]])
r1 = r1+1>3? 0 : r1 +1;
if(a+dp[r1][0]>=n||b+dp[r1][1]>=n||a+dp[r1][0]<0||b+dp[r1][1]<0||visx[a+dp[r1][0]][b+dp[r1][1]])
f1 =1;
else x1 = a + dp[r1][0], y1 = b + dp[r1][1];
}
if(!f2) {
if(aa+dp[r2][0]>=n||bb+dp[r2][1]>=n||aa+dp[r2][0]<0||bb+dp[r2][1]<0||visy[aa+dp[r2][0]][bb+dp[r2][1]])
r2 = r2-1<0? 3 : r2 -1;
if(aa+dp[r2][0]>=n||bb+dp[r2][1]>=n||aa+dp[r2][0]<0||bb+dp[r2][1]<0||visy[aa+dp[r2][0]][bb+dp[r2][1]])
f2 =1;
else x2 = aa + dp[r2][0], y2 = bb + dp[r2][1];
}
// cout<<x1 <<" "<<y1<<" "<<x2 <<" "<<y2<<endl;
dfs(x1,y1,r1,x2,y2,r2);
}
int main()
{
boost;
while(cin>>n&&n){
f1 = 0, f2 =0;
flag=1;
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
cin >>ex1>>ey1>>r1;
cin >>ex2>>ey2>>r2;
dfs(ex1,ey1,r1,ex2,ey2,r2);
if(flag)
cout<<-1<<endl;
}
return 0;
}