​CodeForces 199D​

题目

有两个平行的序列 1 到 n,初始的时候你在上序列 1 位置,每次可以选择跳一下,有三种方式,位置 x +1 ,x - 1,或者跳到另外一个序列的 x + k 位置。同时还有一个值,初始为 0,每次加 1,你挑一下,这个值加一下,要保证任何时候位置值都要大于这个值。问位置值能否超过 n。

分析

直接搜索即可(DFS 或者 BFS),要注意剪枝。不要找重复的状态。

DFS搜索的时候参数就代表状态了,而 BFS要定义状态类型,所以代码要比DFS长。

注意: 写程序变量多的时候,一定要注意命名,要不然搞混找BUG很麻烦。

代码

  1. DFS
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6;
char a[MAX], b[MAX];
int v[2][MAX];
int n, m;
int dfs(int tag, int k, int h)
{
if (k <= h || k <= 0)
return 0;
if (k > n)
return 1;
if (tag == 0 && a[k] == 'X')
return 0;
if (tag == 1 && b[k] == 'X')
return 0;
if (v[tag][k])
return 0;
v[tag][k] = 1;
if (dfs(tag ^ 1, k + m, h + 1))
return 1; //优先选择"jump to the opposite wall"
if (dfs(tag, k + 1, h + 1))
return 1;
if (dfs(tag, k - 1, h + 1))
return 1;
return 0;
}
int main()
{
cin >> n >> m;
scanf("%s%s", a + 1, b + 1);
memset(v, 0, sizeof v);
puts(dfs(0, 1, 0) ? "YES" : "NO");
return 0;
}
  1. BFS
#include <cstdio>
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define d(x) cout<<(x)<<endl;
typedef long long ll;
const int N = 1e5 + 10;
const int base = 60;

int n, k;
char a[N], b[N];
int vis[2][N];

int dir[3] = {-1, 1};
struct node{
int x, y, f; // 当前位置,水位, 左右
node(int x, int y, int f):x(x), y(y), f(f){}
};

queue<node> q;

int bfs(){

q.push(node(1, 0, 1));
while(!q.empty()){
node cnt = q.front();
q.pop();
int next, ty = cnt.y + 1;
if(cnt.x + k > n)
return 1;
for(int i = 0; i < 3; i++){
next = cnt.x + dir[i];
if(next <= ty)
continue;
if(i != 2){
if(cnt.f == 1){ // 如果在左边 1
if(a[next] == '-' && !vis[0][next]){
q.push(node(next, ty, cnt.f));
vis[0][next] = 1;
}
}else{ // 如果在右边 -1
if(b[next] == '-' && !vis[1][next]){
q.push(node(next, ty, cnt.f));
vis[1][next] = 1;
}
}
}else{
if(cnt.f == 1){ // 如果在左边 1
if(b[next] == '-' && !vis[1][next]){
q.push(node(next, ty, -cnt.f));
vis[1][next] = 1;
}
}else{ // 如果在右边 -1
if(a[next] == '-' && !vis[0][next]){
q.push(node(next, ty, -cnt.f));
vis[0][next] = 1;
}
}
}
}
}
return 0;
}

int main() {
cin >> n >> k;
dir[2] = k;
scanf("%s%s", a+1, b+1);
vis[0][1] = 1;
cout << (bfs() ? "YES" : "NO") << endl;
return 0;
}