题意:给定一个n长度的01字符串,下标为1到n。每次前进的跳跃步数不能超过d,假定当前位置为x,当且仅当x+i位置为1,i<=d,才能从位置x转移到位置x+i。
问从起点1到终点n最少步数是多少。
分析:属于很简单的搜索题,我用的是BFS,因为DFS超时了,想不到更好的剪枝...
代码如下:
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int INF = 10000000;
const int maxn = 120;
int n,d,ans;
char s[maxn];
bool vis[maxn];
int step[maxn];
queue<int>que;
inline int Min(int x, int y) {return x<y?x:y;}
int bfs(){
while (!que.empty()) que.pop();
memset(vis,0,sizeof(vis));
que.push(0);
step[0] = 0;
int u;
while (!que.empty()) {
u = que.front();
que.pop();
if (u == n-1) return step[u];
for (int i=1; i<=d; i++) if (s[u+i]=='1' && !vis[u+i]) {
step[u+i] = step[u] + 1;
vis[u+i] = 1;
que.push(u+i);
}
}
return -1;
}
int main(){
while (scanf("%d %d",&n,&d)==2){
scanf("%s",s);
if (s[0]!='1' || s[n-1]!='1') printf("-1\n");
else {
ans = bfs();
printf("%d\n",ans);
}
}
return 0;
}