Cow Navigation(USACO)
题目大意:
给定一个N*N的矩阵,并告诉你每一个格子能否经过,要求你求出(n,1)到(1,n)的最短路径的操作数。
其中操作有2种,第一种是沿着目前的方向走一格,第二种是向左或向右转90°
由于题目设置,一开始我们并不知道起点的方向,所以也可以理解为要我们求出朝向不同但位置相同的2个点的最短路径的方案数,但是注意,此时2个点的操作必须同时进行,比如要前进必须同时前进。
如果某一个点走到了边界外或者走到了不能经过的格子,那么他会返回并且不进行任何操作
如果一个点走到了终点那么接下来的指令它都不会执行
————————————————我是分割线————————————————
这道题目,很显然就是求最短路,然后我们自然会想到spfa
但是这个题目坑就坑在dis数组,由于我们有2个点,而且每个点都有方向,所以是6维的
dis[x1][y1][x2][y2][d1][d2]表示两个点分别从起点走到(x1,y1)方向为d1;走到(x2,y2)方向为d2
然后我们只要初始化后直接SPFA即可
记得check一下有没有超边界。
至于注意事项吗,就是别打挂了。。。暴力调了半小时。。。。。
#include<cstdio>
#include<queue>
#define min(a,b) ((a)<(b)?(a):(b))
#define inf 0x3f3f3f3f
#define MN 21
using namespace std;
int m[MN][MN],dis[MN][MN][MN][MN][][];
int h[]={,-,,,},l[]={,,,,-};
int nowx1,nowx2,nowy1,nowy2,sum1,sum2,td1,td2,ans,n;
bool c[MN][MN][MN][MN][][];
char ch;
struct gather{
int x1,y1,x2,y2,d1,d2;
gather(int x1,int y1,int x2,int y2,int d1,int d2):
x1(x1),y1(y1),x2(x2),y2(y2),d1(d1),d2(d2){}
gather () {}
};
queue<gather>q;
bool check(int x,int y){
if((x<)||(x>n)||(y<)||(y>n))return false;
return true;
}
void spfa()
{
q.push(gather(n,,n,,,));
c[n][][n][][][]=true;
while(!q.empty()){
gather p=q.front();
q.pop();
nowx1=p.x1+h[p.d1];nowx2=p.x2+h[p.d2];
nowy1=p.y1+l[p.d1];nowy2=p.y2+l[p.d2];
if((!check(nowx1,nowy1))||(!m[nowx1][nowy1]))nowx1=p.x1,nowy1=p.y1;
if((!check(nowx2,nowy2))||(!m[nowx2][nowy2]))nowx2=p.x2,nowy2=p.y2;
if(p.x1==&&p.y1==n)nowx1=,nowy1=n;
if(p.x2==&&p.y2==n)nowx2=,nowy2=n;
sum1=dis[nowx1][nowy1][nowx2][nowy2][p.d1][p.d2];
sum2=dis[p.x1][p.y1][p.x2][p.y2][p.d1][p.d2];
if(sum1>sum2+)
{
dis[nowx1][nowy1][nowx2][nowy2][p.d1][p.d2]=sum2+;
if(!c[nowx1][nowy1][nowx2][nowy2][p.d1][p.d2])
q.push(gather(nowx1,nowy1,nowx2,nowy2,p.d1,p.d2));
c[nowx1][nowy1][nowx2][nowy2][p.d1][p.d2]=;
}
td1=(p.d1==)?:p.d1-;td2=(p.d2-==)?:p.d2-;
sum1=dis[p.x1][p.y1][p.x2][p.y2][td1][td2];
if(sum1>sum2+)
{
dis[p.x1][p.y1][p.x2][p.y2][td1][td2]=sum2+;
if(!c[p.x1][p.y1][p.x2][p.y2][td1][td2])
q.push(gather(p.x1,p.y1,p.x2,p.y2,td1,td2));
c[p.x1][p.y1][p.x2][p.y2][td1][td2]=;
}
td1=p.d1==?:p.d1+;td2=p.d2==?:p.d2+;
sum1=dis[p.x1][p.y1][p.x2][p.y2][td1][td2];
if(sum1>sum2+)
{
dis[p.x1][p.y1][p.x2][p.y2][td1][td2]=sum2+;
if(!c[p.x1][p.y1][p.x2][p.y2][td1][td2])
q.push(gather(p.x1,p.y1,p.x2,p.y2,td1,td2));
c[p.x1][p.y1][p.x2][p.y2][td1][td2]=;
}
c[p.x1][p.y1][p.x2][p.y2][p.d1][p.d2]=false;
}
} int main(){
freopen("GP3.in","r",stdin);
freopen("GP3.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%c",&ch);
for(int j=;j<=n;j++)
{
scanf("%c",&ch);
if(ch=='E')m[i][j]=true;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int k=;k<=n;k++)
for(int l=;l<=n;l++)
for(int dd1=;dd1<=;dd1++)
for(int dd2=;dd2<=;dd2++)
dis[i][j][k][l][dd1][dd2]=inf;
dis[n][][n][][][]=;
ans=inf;
spfa();
for(int i=;i<=;i++)
for(int j=;j<=;j++)
ans=min(ans,dis[][n][][n][i][j]);
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
}
Cow Navigation(USACO)的更多相关文章
- Secret Cow code(USACO)
题目描述:zxyer为了防止他的标程被别人抄走,他在计算机中的rar文件上设置了一个密码,其中每一个密码都有一个初始字符串,字符串由大写字母组成,且长度不超过30位,每一个密码还有一个询问,询问为一个 ...
- 考前停课集训 Day2 非
因为太长了 所以一天一天分开发 Day2 昨天晚上没开黑车 没脱衣服就睡了 可能是我难受了…… 新的一天. 早上好. 我没去晨跑,早上先和团长集合了,没看见rkbudlo来 于是就先吃饭了 去机房的时 ...
- 牛客假日团队赛1 D.Promotion Counting
链接: https://ac.nowcoder.com/acm/contest/918/D 题意: Bessie the cow is helping Farmer John run the USA ...
- USACO 2.3 Cow Pedigrees
Cow Pedigrees Silviu Ganceanu -- 2003 Farmer John is considering purchasing a new herd of cows. In t ...
- 3298: [USACO 2011Open]cow checkers
3298: [USACO 2011Open]cow checkers Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 65 Solved: 26[Su ...
- USACO 6.1 Cow XOR
Cow XORAdrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All of ...
- BZOJ3298: [USACO 2011Open]cow checkers(佐威夫博弈)
3298: [USACO 2011Open]cow checkers Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 195 Solved: 96[S ...
- bzoj 3298: [USACO 2011Open]cow checkers -- 数学
3298: [USACO 2011Open]cow checkers Time Limit: 10 Sec Memory Limit: 128 MB Description 一天,Besssie准备 ...
- USACO 2012 Feb Cow Coupons
2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec Memory Limit: 128 MB Submit: 349 Solved: 181 [Su ...
随机推荐
- ASCII码排序 南阳acm4
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输 ...
- C++基础 匿名对象
以下几种情况又会匿名对象 (1)对象构造 与 匿名对象 Test t1 = Test(); 这时,Test()会构造匿名对象,并且是调用无参构造函数,然后 t1 将匿名对象扶正. (2)对象赋值 与 ...
- 10.2 ajax
Ajax Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互 ...
- 6,MongoDB 之 Array Object 的特殊操作
相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比较特殊的类型了 特殊在哪里呢?在他们的操作上又有什么需要注 ...
- WPF 加载等待动画
原文:WPF 加载等待动画 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_29844879/article/details/80216587 ...
- 4525: [Cerc2012]Kingdoms
4525: [Cerc2012]Kingdoms 题意 n个国家,两两之间可能存在欠债或者被欠债的关系,一个国家破产:其支出大于收入.问一个国家能否坚持到最后. 思路 很有意思的一道题. dp[s]表 ...
- Java虚拟机之搜索class文件
Java命令 Java虚拟机的工作是运行Java应用程序.和其他类型的应用程序一样,Java应用程序也需要一个入口点,这个入口点就是我们熟知的main()方法.如果一个类包含main()方法,这个类就 ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架3
1:使用Framework工具类封装http请求 接上第二篇的步骤,现在在站点中使用封装好的组件,将framework编译好之后把dll提取出来,然后放到lib当中 在website中引用dll 接下 ...
- Java中的垃圾回收机制&内存管理&内存泄漏
1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...
- 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...