P1518 两只塔姆沃斯牛 The Tamworth Two(简单的搜索题)
题目描述 两只牛逃跑到了森林里。农夫John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。
追击在10x10的平面网格内进行。一个格子可以是:
一个障碍物, 两头牛(它们总在一起), 或者 农民John. 两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。
一个格子可以是:
. 空地
- 障碍物
C 两头牛
F 农民John
这里有一个地图的例子:
……
…*…
………
…
…*.F…
……
…*…
…C…*
….…
..…
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍(地图边沿也是障碍),它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。 同时,它们不会离开地图。
农民John深知牛的移动方法,他也这么移动。
每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。
读入十行表示农夫John,两头牛和所有障碍的位置的地图。每行都只包含10个字符,表示的含义和上面所说的相同,你可以确定地图中只有一个’F’和一个’C’.'F’和’C’一开始不会处于同一个格子中。
计算农夫John需要多少分钟来抓住他的牛,假设牛和农夫John一开始的行动方向都是正北(即上)。 如果John和牛永远不会相遇,输出0。
输入输出格式 输入格式: 每行10个字符,表示如上文描述的地图。
输出格式: 输出一个数字,表示John需要多少时间才能抓住牛们。如果John无法抓住牛,则输出0。
输入输出样例 输入样例#1: …… …… ……… … ….F… …… …… …C… ….… ..… 输出样例#1: 49 说明 翻译来自NOCOW
USACO 2.4 农夫抓两头牛,农夫跟牛的行进方式一样,但是要注意
牛-------> |
<------农夫 |
---|
这种情况不算相遇。
#include<bits/stdc++.h>
using namespace std;
const int dx[4]={-1,0,1,0};//上、右、下、左四个方向
const int dy[4]={0,1,0,-1};
int cx,cy,ct;
int fx,fy,ft;
bool f[21][21],v[21][21][4][21][21][4];
void dfs(int k)
{
if(cx==fx && cy==fy)
{
printf("%dn",k);
return ;
}
if(v[fx][fy][ft][cx][cy][ct]==false)
{
printf("0n");
return;
}
v[fx][fy][ft][cx][cy][ct]=false;
if(f[cx+dx[ct]][cy+dy[ct]]==false)
{
ct++;if(ct==4) ct=0;
}
else cx=cx+dx[ct],cy=cy+dy[ct];
if(f[fx+dx[ft]][fy+dy[ft]]==false)
{
ft++;if(ft==4) ft=0;
}
else fx=fx+dx[ft],fy=fy+dy[ft];
dfs(k+1);
}
int main()
{
int i,j;char st[21];
memset(f,false,sizeof(f));
for(i=1;i<=10;i++)
{
scanf("%s",st+1);
for(j=1;j<=10;j++)
{
if(st[j]=='.') f[i][j]=true;
if(st[j]=='F') fx=i,fy=j,f[i][j]=true;
if(st[j]=='C') cx=i,cy=j,f[i][j]=true;
}
}
ct=ft=0;
memset(v,true,sizeof(v));
dfs(0);
return 0;
}
- Facebook的漏洞可以让攻击者在分分钟内重置用户账户密码
- 【Java学习笔记之十七】Java中普通代码块,构造代码块,静态代码块区别及代码示例分析
- 【机器学习笔记之六】Bagging 简述
- 洛谷 P1553 数字反转(升级版)【字符串+STL stack】
- C# 实现发送手机短信
- 软件测试人员必须掌握的Linux基本命令
- 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测
- Capturing Packets in Linux at a Speed of Millions of PPS
- 【机器学习笔记之四】Adaboost 算法
- 【Java学习笔记之十九】super在Java继承中的用法小结
- 【Java学习笔记之二十一】抽象类在Java继承中的用法小结
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
- 基于Windows下python环境变量配置
- 【机器学习笔记之七】PCA 的数学原理和可视化效果
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 leet(数组中的第 K 个最大元素)难度:中等 DAY-29
- 线程之生产者消费者模式
- Redis学习笔记 -- 2
- 一天一大 leet(单词拆分)难度:中等 DAY-25
- 多线程必考的「生产者 - 消费者」模型,看乔戈里这篇文章就够了
- 一天一大 leet(三角形最小路径和)难度:中等-Day20200715
- 一天一大 leet(将有序数组转换为二叉搜索树)难度:简单-Day20200703
- 一天一大 leet(缺失的第一个正数)难度:困难DAY-27
- 【玩转Redis面试第3讲】一次性将Redis RDB持久化和AOF持久化讲透
- 一天一大 leet(用两个栈实现队列)难度:简单 DAY-30
- SpringBoot实战:整合Redis、mybatis,封装RedisUtils工具类等(附源码)
- 时间序列&日期学习笔记大全(下)
- 带你了解鸿蒙开发基本流程
- Python 中也可以写 Excel 中的 “Vlookup” 函数?太牛逼了吧!
- 一天一大 leet(除数博弈)难度:简单-Day20200724