luogu P1518 两只塔姆沃斯牛 The Tamworth Two
luogu 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
这个破题乍一看应该是模拟,但是模拟似乎无从下手
但是发现地图只有10*10
方向只有4个,所以可以用到(搜索?)的思想,可以设状态来判无解的情况
所以我们设\(f[\varphi][k1][\theta][k2]\)为第一个点为\(\varphi\)方向为\(k1\)第二个点为\(\theta\)方向为\(k2\)的状态
然后就可以大力循环(递归?)
点的结构体:
bool inmp(int x,int y){
return 1<=x&&x<=10&&1<=y&&y<=10&&mp[x][y]!='*';
}
struct p{
int x,y,k;
void turn(){k=(k+1)%4;}
friend p& operator ++ (p &a){
if(!inmp(a.x+dx[a.k],a.y+dy[a.k]))a.turn();
else {a.x+=dx[a.k],a.y+=dy[a.k];}
return a;
}
friend bool operator == (const p &a,const p &b){
return a.x==b.x&&a.y==b.y;
}
}a,b,c;
为了方便直接用++当做走一步
然后就可以循环/递归枚举每次走的情况
void dfs(p a,p b,int step){
if(f[a.x][a.y][a.k][b.x][b.y][b.k]){cout<<0<<endl;exit(0);}
f[a.x][a.y][a.k][b.x][b.y][b.k]=1;
++a;++b;
// cout<<a.x<<' '<<a.y<<' '<<b.x<< ' '<<b.y<<endl;
if(a==b){cout<<step<<endl;exit(0);}
dfs(a,b,step+1);
}
并没有什么用的递归QWQ
完整代码:
#include<iostream>
#include<cstdio>
using namespace std;
char mp[15][15];
const int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int f[11][11][4][11][11][4];
bool inmp(int x,int y){
return 1<=x&&x<=10&&1<=y&&y<=10&&mp[x][y]!='*';
}
struct p{
int x,y,k;
void turn(){k=(k+1)%4;}
friend p& operator ++ (p &a){
if(!inmp(a.x+dx[a.k],a.y+dy[a.k]))a.turn();
else {a.x+=dx[a.k],a.y+=dy[a.k];}
return a;
}
friend bool operator == (const p &a,const p &b){
return a.x==b.x&&a.y==b.y;
}
}a,b,c;
void dfs(p a,p b,int step){
if(f[a.x][a.y][a.k][b.x][b.y][b.k]){cout<<0<<endl;exit(0);}
f[a.x][a.y][a.k][b.x][b.y][b.k]=1;
++a;++b;
// cout<<a.x<<' '<<a.y<<' '<<b.x<< ' '<<b.y<<endl;
if(a==b){cout<<step<<endl;exit(0);}
dfs(a,b,step+1);
}
int main(){
for(int i=1;i<=10;++i){
scanf("%s",mp[i]+1);
}
for(int i=1;i<=10;++i){
for(int j=1;j<=10;++j){
if(mp[i][j]=='C')a.x=i,a.y=j;
if(mp[i][j]=='F')b.x=i,b.y=j;
}
}
a.k=0,b.k=0;
dfs(a,b,1);
return 0;
}
luogu P1518 两只塔姆沃斯牛 The Tamworth Two的更多相关文章
- 洛谷P1518 两只塔姆沃斯牛 The Tamworth Two
P1518 两只塔姆沃斯牛 The Tamworth Two 109通过 184提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交 讨论 题解 最新讨论 求数据 题目背景 题目描 ...
- 洛谷 P1518 两只塔姆沃斯牛 The Tamworth Two
P1518 两只塔姆沃斯牛 The Tamworth Two 题目背景 题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在1 ...
- 洛谷——P1518 两只塔姆沃斯牛 The Tamworth Two
https://www.luogu.org/problem/show?pid=1518 题目背景 题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为( ...
- P1518 两只塔姆沃斯牛 The Tamworth Two(简单的搜索题)
题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它们总 ...
- 洛谷 P1518 两只塔姆沃斯牛
P1518 两只塔姆沃斯牛 The Tamworth Two 简单的模拟题,代码量不大. 他们走的路线取决于障碍物,可以把边界也看成障碍物,遇到就转,枚举次,因为100 * 100 * 4,只有4个可 ...
- P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two
// Problem: P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two // Contest: Luogu // URL: https://www.luogu.com ...
- 【USACO 2.4.1】两只塔姆沃斯牛
[题目描述] 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它 ...
- powershell中的两只爬虫
--------------------序-------------------- (PowerShell中的)两只爬虫,两只爬虫,跑地快,爬网页不赖~~~ 一只基于com版的ie,一只基于.net中 ...
- 青蛙的约会 扩展欧几里得 方程ax+by=c的整数解 一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。
/** 题目:青蛙的约会 链接:https://vjudge.net/contest/154246#problem/R 题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y:(x!=y,同时逆时针运 ...
随机推荐
- svn配置多仓库与权限控制
telnet: connect to address 47.106.115.228: Connection refused svn执行上下文错误由于目标计算机积极拒绝无法连接 标签: svn 2017 ...
- 404. Sum of Left Leaves 左叶子之和
[抄题]: Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are ...
- 出现命令提示apt-get -f install的解决方法
提示apt-get -f install这个信息,然后查看其他的提示信息发现时缺少了一些以依赖库. 解决办法为执行:sudo apt-get -f install命令. 该命令的含义是去补全那些缺少的 ...
- 掌握zigbee网络里的相关的重要概论
1.zigbee无线通信,需要高频的载波来提供发射效率,zigbee模块之间要可以正常的收发,必须把接收频率设置和发射模块的载波频率一致. 2.zigbee有27个载波可以进行通信,载波叫做信道(无线 ...
- C++ generic tools -- from C++ Standard Library
今晚学了一下C++标准程序库, 来简单回顾和总结一下. 1.pair 结构体 // defined in <utility> , in the std namespace namespac ...
- Perl语言编程>>学习笔记
1. 使用反引号可以调用外部程序并返回程序的输出, 如 $cwd = `pwd`; 2. Perl 中的变量类型之间的区别主要是单数和复数; 单数变量称为标量 $scalar , 复数变量称为数组 ...
- MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
今天购物车突然不能添加了,发现redis报错了,重启了一下好了,一会又报错了. 错误信息: MISCONF Redis is configured to save RDB snapshots, but ...
- javascript总结47: JS动画原理&jQuery 效果- 各种动画
1 动画的原理就是: 盒子本身的位置+步长 2 什么是步长? var box=document.getElementById('box'); btn.onclick = function() { // ...
- TinyMCE3.x整合教程-Xproer.WordPaster
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- uname查看系统名称
功能说明:uname用来获取电脑和操作系统的相关信息. 语 法:uname [-amnrsvpio][--help][--version] 补充说明:uname可显示linux主机所用的操作系统的版本 ...