图灵机游戏
说是一道可BFS可图的题,但待看懂了后发现其实也很简单(刚做这题时我才会BFS,辣鸡地WA掉了,虽然现在我还是很辣鸡)。
那就在这里简单地说一下吧,让大家看看我的两种思路:
1.图:由于本题可以看作是从起点 “1”寻找到终点“n”的最短路,也就是一个单源最短路问题,由题我们知道,我们想要扩展点,我们有两种选择,一是跳转至当前点相对的指定点(即存在一条确定边),二是改变一个点相对的指定点(改变边?或是增加边?),听说这道题可以用SPFA解决,但没有用图的解法去做(自己太弱了...),可能之后会补上。
2.BFS:直接丢一个大牛的博客吧,我就是从那里得到经验的,里面解释得很详细,点这里 大牛 。
最后贴上羞耻的代码:
#include<queue>
#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int N=1000000+5;
int n;
int a[N];
int dis[N];
queue<int> q;
int main(){
scanf("%d",&n);
if ( n==1 ){
printf("0"); // 只有一个点,不需要操作
return 0;
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
memset(dis,INF,sizeof(dis));
dis[1]=0;
dis[a[1]]=1; // 初始化
q.push(a[1]); // 入队第一个扩展点
while( !q.empty() ){
int num=q.front();
q.pop();
if ( num==n ) break;
if ( dis[num-1]==INF ) q.push(num-1),dis[num-1]=dis[num]+1;
if ( dis[num+1]==INF ) q.push(num+1),dis[num+1]=dis[num]+1;
if ( a[num]!=num-1 && a[num]!=num+1 && dis[a[num]]==INF ) q.push(a[num]),dis[a[num]]=dis[num]+1;
}
printf("%d",dis[n]);
return 0;
}
我在怀疑我是不是只能看题姐才能做题,但这也太弱了吧(虽然本来就是) 。
2017.1.28