天天看点

CodeForces - 198B Jumping on Walls

点击打开链接

题意:  跳跃忍者,两个串就能看成两个墙。然后往上蹦。

题解: 广搜,深搜都可以。  重点是走过的不能走。不要以为水堵着就不能走了。

因此,bfs 超内存。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<queue>
#include<vector>
using namespace std;
const int maxn=1e5+100;
int n,m,x,y,cnt;
char a[2][maxn];
int v[2][maxn];
struct node {
    int x,pos;
    int water;
}e,u,st;
int bfs(){
    st.x=1;st.pos=0;
    st.water=0;
    v[st.pos][st.x]=1;
    queue<node>que;
    que.push(st);
    while(!que.empty()){
        u=que.front();//printf("~~%d ~~%d~%d\n",u.pos,u.water,u.x);
        que.pop();
        e.pos=u.pos;
        e.x=u.x-1;e.water=u.water+1;
        if(e.x>0&&e.x>e.water&&a[e.pos][e.x]!='X'&&!v[e.pos][e.x]) {
            que.push(e);v[e.pos][e.x]=1;
        }
        e.x=u.x+1;if(e.x>n) return 1;
        if(e.x>0&&e.x>e.water&&a[e.pos][e.x]!='X'&&!v[e.pos][e.x]){
            que.push(e);v[e.pos][e.x]=1;
        }
        e.x=u.x+m;if(e.x>n) return 1;
        if(e.pos) e.pos=0;
        else e.pos=1;
        if(e.x>0&&e.x>e.water&&a[e.pos][e.x]!='X'&&!v[e.pos][e.x]){
            que.push(e);v[e.pos][e.x]=1;
        }
    }
    return 0;
}
int main(){

    while(~scanf("%d %d",&n,&m)){
        scanf("%s %s",a[0]+1,a[1]+1);
        if(bfs()) printf("YES\n");
        else printf("NO\n");
    }

    return 0;
}
           

深搜。  注意深搜里的顺序。 三个方向顺序不一样,就会错。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<queue>
#include<vector>
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+100;
int n,m,water;
char a[2][maxn];
int v[2][maxn];
int dfs(int pos,int j){
    if(j>n) return 1;
    if(a[pos][j]=='X'||j<water||v[pos][j]) return 0;
    v[pos][j]=1;
    water++;
    int f=dfs(pos,j-1)||dfs(1-pos,j+m)||dfs(pos,j+1);
    water--;
    return f;
}
int main(){

    scanf("%d %d",&n,&m);
        water=1;
        scanf("%s %s",a[0]+1,a[1]+1);
        if(dfs(0,1)) printf("YES\n");
        else printf("NO\n");
    return 0;
}