【codevs】2292图灵机游戏

题目描述 Description

【Shadow 1】第二题

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

游戏规则如下:

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

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

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

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

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

输入描述 Input Description
第1行,1个整数N;
第2行,N个整数Ai。
输出描述 Output Description

1行,1个整数,为最少的操作次数。

样例输入 Sample Input
5
3 4 2 5 3
样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

对于30%的数据,1≤N≤10;
对于60%的数据,1≤N≤1000;
对于100%的数据,1≤N≤100000,1≤Ai≤N。

<h4>样例解释</h4>
1.先将第1格的值加1
2.跳到第4格
3.跳到第5格,结束游戏
最简单的bfs,最开始看的时候还以为要把三种操作分为3种情况,但是没有ac。后面才知道只用分一种情况,其实就是最简单的bfs。

当然这道题也可以用spfa。

下面贴出bfs的代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int a[100050];
int queue[100050];
int head,tail;
bool visit[100050];
int ans[100050];//走到第几个点需要的操作数 

void bfs()
{
	head=1;
	tail=1;
	queue[tail]=a[1];
	ans[a[1]]=1;
	visit[1]=true;
	while(tail>=head)
	{
		
		int q=queue[head];
		if(q==n) break;
		if(!visit[a[q]])
		{
			tail++;
			queue[tail]=a[q];
			ans[a[q]]=ans[q]+1;
			visit[a[q]]=true;
		}
		if(q+1<=n&&!visit[q+1])
		{
			tail++;
			queue[tail]=q+1;
			ans[q+1]=ans[q]+1;//
			visit[q+1]=true;
		}
		if(q-1>0&&q-1<=n&&!visit[q-1])
		{
			tail++;
			queue[tail]=q-1;
			ans[q-1]=ans[q]+1;//
			visit[q-1]=true;
		}
		head++;
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	memset(visit,false,sizeof(visit));
	memset(ans,0,sizeof(ans));
	bfs();
	if(n==1) printf("%d\n",0);
	else
	{
		printf("%d",ans[n]); 
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值