洛谷P1518 两只塔姆沃斯牛 The Tamworth Two【模拟】

题目描述 https://www.luogu.org/problemnew/show/P1518
模拟模拟模拟 变量名像注意不能打错,只有遇到障碍或是边界才能转方向,也只能顺时针转

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool fl;
int a[15][15],ans=1e5,cx,cy,fx,fy;
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//0上1右2下3左 
void dfs(int ncx,int ncy,int nfx,int nfy,int nc,int nf,int t)
{//          农夫的位置       牛的位置    农夫 牛的朝向  时间 
    if(ncx==nfx&&ncy==nfy)
    {
    	ans=min(ans,t); fl=1;
    	return;
	}
	if(t>1e5) return;
    int x1,y1,x2,y2,cc,ff;  bool bc=0,bf=0;
    x1=ncx+d[nc][0],y1=ncy+d[nc][1];
    if(x1>=1&&x1<=10&&y1>=1&&y1<=10&&!a[x1][y1]) bc=1;//农夫能走 
    x2=nfx+d[nf][0],y2=nfy+d[nf][1];
    if(x2>=1&&x2<=10&&y2>=1&&y2<=10&&!a[x2][y2]) bf=1;//牛能走 
    cc=(nc+1)%4,ff=(nf+1)%4;
	if(bc&&bf) dfs(x1,y1,x2,y2,nc,nf,t+1);//都走不转 
    if(bc&&!bf) dfs(x1,y1,nfx,nfy,nc,ff,t+1);//农夫走 牛转 
	if(bf&&!bc) dfs(ncx,ncy,x2,y2,cc,nf,t+1);//农夫转 牛走 
    if(!bf&&!bc) dfs(ncx,ncy,nfx,nfy,cc,ff,t+1);//都转不走 
}
int main() 
{ 
   for(int i=1;i<=10;i++)
     for(int j=1;j<=10;j++)
     {
     	char aa; cin>>aa;
        if(aa=='*') a[i][j]=1;//不可走
        if(aa=='C') cx=i,cy=j;//农夫的位置 
		if(aa=='F') fx=i,fy=j;//牛的位置 
	 }
   dfs(cx,cy,fx,fy,0,0,0);
   if(fl) printf("%d",ans);
   else puts("0");
 	
  return 0;	
}

猜你喜欢

转载自blog.csdn.net/qq_42920122/article/details/88876492