【codevs】2292图灵机游戏

Shadow最近知道了图灵机是什么(Shadow:就是一行格子和一个机器头移来移去的呗!),于是他突发奇想,创造了一个新游戏——“图灵机游戏”(Shadow:好听吧?)。

游戏规则如下:

在一条长长的纸上有N个格子,每个格子上都有一个数,第i格的数记为Ai,机器头刚开始在第1格。这个游戏有两个操作:

1.如果现在在第i格,则可以移动机器头到第Ai格;

2.把某个Ai减少或增加1。

然而,fotile96看了之后却不以为然。“嗯,你挑战一下用最少次数使机器头到达第N格吧,这样好玩些……”

现在,Shadow已经快Crazy了。于是,Shadow把脸转向了你……

之前写了一个bfs分三种情况讨论然而只能得一半的分(○` 3′○)

后来师兄解释了一遍才知道其实只有一种情况,就是最简单的bfs就可以辣(o゜▽゜)o☆

好像也有写spfa的(大雾)

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

int n;

int a[100001];

int queue[100001];

int head=1;

int tail=1;

int ans[100001];

bool f[100001];

void bfs()

{

queue[1]=a[1];//入队第一个点

f[a[1]]=true;//标记

ans[a[1]]=1;//记录步数

while(head<=tail)//当队列不为空

{

int u=queue[head];//!!注:这里不要再把出队的元素标记为false了,你不会再访问一个已访问了的点,标记false的话可能会跳不出循环最终RE

if(u==n)  return;

if (!f[a[u]])

{

queue[++tail]=a[u];

ans[a[u]]=ans[u]+1;

f[a[u]]=true;

}

if (u<n&&!f[u+1])//边界

{

queue[++tail]=u+1;

ans[u+1]=ans[u]+1;

f[u+1]=true;

}

if (u>1&&!f[u-1])

{

queue[++tail]=u-1;

ans[u-1]=ans[u]+1;

f[u-1]=true;

}

++head;

}

}

int main()

{

scanf("%d",&n);

memset(f,0,sizeof(f));

for(int i=1;i<=n;i++)

{

scanf("%d",&a[i]);

}

if(n==1)

{

printf("%d",0);//***!如果只有一个格子就不用跳了=v=

return 0;

}

bfs();

printf("%d",ans[n]);

return 0;

}

蒟蒻= =,请多指教

原文地址:http://www.cnblogs.com/orange-/p/4884214.html

时间: 2024-10-16 02:41:45

【codevs】2292图灵机游戏的相关文章

CodeVS 2292 图灵机游戏

怎么说呢..这道题断断续续地调了两个晚上..这题通过率也是感人啊.. 题目大意:给定一串序列,有两个操作,开始位置在1,求最少多少步能到达n.有两个操作: 1.如果现在在第i格,那么可以跳到第a[i]格: 2.把某一个a[i]加1或减1. 算法:SPFA or bfs(我写的是spfa..但是好像bfs更好写=_=). 一开始点开这道题,一眼看过去就是DP..(成功被DP地套路洗脑..),然后推了十几分钟方程,搞不动啊.. 看了一眼标签,最短路..于是开始往SPFA方面想.. 首先建边就感觉非常

2292 图灵机游戏

2292 图灵机游戏 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description [Shadow 1]第二题 Shadow最近知道了图灵机是什么(Shadow:就是一行格子和一个机器头移来移去的呗!),于是他突发奇想,创造了一个新游戏——“图灵机游戏”(Shadow:好听吧?). 游戏规则如下: 在一条长长的纸上有N个格子,每个格子上都有一个数,第i格的数记为Ai,机器头刚开始在第1格.这个游戏有两个操作: 1.如果现在在第i格,则可以移动机

codevs 1512 转向游戏 题解

Codevs 1512转向游戏 题解 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 小明自认为方向感很好,请小红来测试.小红先让小明面对北方立正站好,然后发出"向左转""向右转"或"向后转"的命令.每个命令执行后,小明都正确地说出了他面对的方向.小红的命令共N个(1≤n≤10000),请你统计小明说[南]的次数. 命令是以数字方式表达: 0---向左转 1---向右转 2

求次短路 codevs 1269 匈牙利游戏

codevs 1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Welcome to the Hungary Games! The streets of Budapest form a twisted network of one-way streets. 欢迎来到匈牙利游戏!布达佩斯(匈牙利首都)的街道形成了一个弯曲的单向网络. You have been fo

codevs 1269 匈牙利游戏

codevs 1269 匈牙利游戏 题目描述 Description Welcome to the Hungary Games! The streets of Budapest form a twisted network of one-way streets. 欢迎来到匈牙利游戏!布达佩斯(匈牙利首都)的街道形成了一个弯曲的单向网络. You have been forced to join a race as part of a "Reality TV" show where yo

codevs 1229 数字游戏

1229 数字游戏 http://codevs.cn/problem/1229/ 题目描述 Description Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间.  这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两个数字X和K.Lele要做的事情就是重新拼这些纸牌,组成数字 T ,并且 T + X 是 K 的正整数倍. 有时候,当纸片很多的时候,Lele经常不能在一节课之内拼出来,但是他又想知道答案,所以,他

codevs 2853 方格游戏--棋盘dp

方格游戏:http://codevs.cn/problem/2853/ 这和传纸条和noip方格取数这两个题有一定的相似性,当第一眼看到的时候我们就会想到设计$dp[i][j][k][l]$(i,j表示一个人走到 i 行 j 个点,而另一个人走到 k 行第l个点)这么一个状态. 转移方程当然是$dp[i][j][k][l] = max{ dp[i-1][j][k-1][l] ,dp[i-1][j][k][l-1] ,dp[i][j-1][k-1][l] ,dp[i][j-1][k][l-1 }$

codevs 1198 国王游戏

传送门 题目描述 Description 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣

codevs——2853 方格游戏(棋盘DP)

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 菜菜看到了一个游戏,叫做方格游戏~ 游戏规则是这样的: 在一个n*n的格子中,在每个1*1的格子里都能获得一定数量的积分奖励,记左上角为(1,1),右下角为(n,n).游戏者需要选择一条(1,1)到(n,n)的路径,并获得路径上奖励的积分.对于路径当然也有要求啦,要求是只能往坐标变大的方向走[从(x,y)到(x+1,y)或者(x,y+1)],走过2n-1个区域到达(n,