Gym
来源:互联网 发布:网络最新骗术扒人 编辑:程序博客网 时间:2024/05/20 01:36
http://codeforces.com/gym/101503/my
给定一个遥控器,给你若干个选项。
要求你从a到b,找到最小的次数。
直接暴力搜索。
发现有总共四种方式。
①单独按键
② 用输出二位数
③ 加
④ 减。
注意一个问题,这个广搜是有顺序的。
即先 ①再③④ 再 ②,这样可以保证每次得到的都是最小的次数。
。
并且这道题广搜里面的顺序,如果换一下,就错了。。
我开始以为这个顺序能保证 次数最少,所以我就直接没对结果取min。
但是这样是错的。
大概广搜的思路是。
首先的状态是 原数,个数。
然后用+和-。二位数。
#include <bits/stdc++.h>using namespace std;/* 方法:直接模拟。*/const int maxn=104;bool vis[maxn];int a[13];int ans;void bfs(int s,int t){ queue<pair<int,int> >q; q.push(make_pair(s,0)); for(int i=0;i<=9;i++){ if(!vis[i]&&a[i]){ q.push(make_pair(i,1)); vis[i]=true; } } vis[s]=true; while(!q.empty()){ pair<int,int>u=q.front(); vis[u.first]=true; vis[t]=false; q.pop(); if(u.first==t){ ans=min(ans,u.second); vis[t]=false; continue; } if(u.first==99&&!vis[0]&&a[10]) q.push(make_pair(0,u.second+1)); else if(!vis[u.first+1]&&a[10]) q.push(make_pair(u.first+1,u.second+1)); if(u.first==0&&!vis[99]&&a[11]) q.push(make_pair(99,u.second+1)); else if(!vis[u.first-1]&&a[11]) q.push(make_pair(u.first-1,u.second+1)); for(int i=0;i<=9;i++){ for(int j=0;j<=9;j++){ if(!vis[i*10+j]&&a[12]&&a[i]&&a[j]) q.push(make_pair(i*10+j,u.second+3)); } } }}int main(){ int a1,b1; while(cin>>a[1]){ memset(vis,false,sizeof(vis)); for(int i=2;i<=3;i++) cin>>a[i]; cin>>a[10]; for(int i=4;i<=6;i++) cin>>a[i]; cin>>a[11]; for(int i=7;i<=9;i++) cin>>a[i]; cin>>a[12]; cin>>a[0]; scanf("%d%d",&a1,&b1); ans=1e6; //cout<<"!!"<<endl; bfs(a1,b1); if(ans!=1e6) printf("%d\n",ans); else puts("-1"); } return 0;}
}
“`