.

一个错误的思路,认为走到边界就逃出生天了:

错误代码1:

#include <bits/stdc++.h>
using namespace std;
#define ll long long

char g[4505][4505];
bool v[4505][4505];

int n,m;
int si,sj;

void copy_g(){
    for(int i=n+1;i<=2*n;i++){
        for(int j=m+1;j<=2*m;j++){
            if(g[i][j]=='S'){
                si=i;sj=j;
                g[i][j]='.';
            }
        }
    }

    for(int i=n+1;i<=2*n;i++){
        for(int j=m+1;j<=2*m;j++){
            g[i-n][j]=g[i+n][j]=g[i][j];
            g[i-n][j-m]=g[i-n][j+m]=g[i][j];
            g[i][j-m]=g[i][j+m]=g[i][j];
            g[i+n][j-m]=g[i+n][j+m]=g[i][j];
        }
    }
}

struct cor{
    int i,j;
    cor(int i,int j):i(i),j(j){}
};

queue<cor> q;

int check(int i,int j){
    if(g[i][j]=='#'||v[i][j])
        return 0;
    if(i==1||j==1||i==3*n||j==3*m){
        return -1;
    }

    v[i][j]=1;
    q.push(cor(i,j));
    return 1;
}

void show(int ii,int jj){
    for(int i=1;i<=3*n;i++){
        for(int j=1;j<=3*m;j++){
            if(i==ii&&j==jj){
                printf("S");
            }
            else{
                if(g[i][j]=='#'||g[i][j]=='.'){
                    printf("%c",g[i][j]);
                }
                else{
                    printf("*");
                }
            }
        }
        printf("\n");
    }
    printf("\n");
}

void bfs(){
    memset(v,0,sizeof(v));
    while(!q.empty())
        q.pop();

    check(si,sj);
    while(!q.empty()){
        int i=q.front().i,j=q.front().j;
        q.pop();

        show(i,j);

        if(check(i-1,j)==-1||check(i+1,j)==-1||check(i,j-1)==-1||check(i,j+1)==-1){
            printf("Yes\n");
            return;
        }
    }

    printf("No\n");
    return;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=n+1;i<=2*n;i++){
            scanf("%s",(g[i]+m+1));
        }
        copy_g();
        bfs();
    }
}

这一组数据可以让你困在其中:

6 9
#.#.#.#.#
S.#.#.#.#
###.#.###
#...#...#
#.#####.#
#.#...#.#

但是拓展成5*5的话……未必不行哦?

5*5*1500*1500,改成bool就56MB。

但这样是错的因为这个:

16 10
##.......#
########.#
........#S
#######..#
.......#..
######..##
......#...
#####..###
.....#....
####..####
....#.....
###..#####
...#......
##..######
..#.......
#..#######

所以并不是走几个方块就确定可以无穷的。

 

错误代码2:

#include <bits/stdc++.h>
using namespace std;
#define ll long long

char G[1505][1505];
bool g[7505][7505];

int n,m;
int si,sj;

void copy_g(){
    //memset(g,0,sizeof(g));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(G[i][j]=='S'){
                si=i+2*n;sj=j+2*m;
                G[i][j]='.';
            }
            if(G[i][j]=='#'){
                for(int di=0;di<=+4;di++){
                    for(int dj=0;dj<=+4;dj++){
                        g[i+di*n][j+dj*m]=1;
                    }
                }
            }
            else{
                for(int di=0;di<=+4;di++){
                    for(int dj=0;dj<=+4;dj++){
                        g[i+di*n][j+dj*m]=0;
                    }
                }
            }
        }
    }
}

struct cor{
    int i,j;
    cor(int i,int j):i(i),j(j){}
};

queue<cor> q;

/*int bfs_check(int i,int j){
    if(g[i][j])
        return 0;
    if(i==1||j==1||i==5*n||j==5*m){
        return -1;
    }

    g[i][j]=1;
    q.push(cor(i,j));
    return 1;
}*/

void show(int ii,int jj){
    for(int i=1;i<=5*n;i++){
        for(int j=1;j<=5*m;j++){
            if(i==ii&&j==jj){
                printf("S");
            }
            else{
                if(g[i][j]){
                    printf("#");
                }
                else{
                    printf(".");
                }
            }
        }
        printf("\n");
    }
    printf("\n");
}

/*void bfs(){
    while(!q.empty())
        q.pop();

    check(si,sj);
    while(!q.empty()){
        int i=q.front().i,j=q.front().j;
        q.pop();

        //show(i,j);

        if(bfs_check(i-1,j)==-1||bfs_check(i+1,j)==-1||bfs_check(i,j-1)==-1||bfs_check(i,j+1)==-1){
            printf("Yes\n");
            return;
        }
    }

    printf("No\n");
    return;
}*/

bool dfs(int ri,int rj){
    if(ri==1||rj==1||ri==5*n||rj==5*m){
        return 1;
    }

    //show(ri,rj);

    bool f=0;
    g[ri][rj]=1;
    if(!g[ri-1][rj])
        f|=dfs(ri-1,rj);
    if(f)return 1;
    if(!g[ri+1][rj])
        f|=dfs(ri+1,rj);
    if(f)return 1;
    if(!g[ri][rj-1])
        f|=dfs(ri,rj-1);
    if(f)return 1;
    if(!g[ri][rj+1])
        f|=dfs(ri,rj+1);
    if(f)return 1;

    return 0;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;i++){
            scanf("%s",(G[i]+1));
        }
        copy_g();

        /*bfs();*/

        //show(si,sj);

        bool f=dfs(si,sj);
        if(f)
            printf("Yes\n");
        else
            printf("No\n");
    }
}

以为走过迷宫的格子再走过就可以,没想到可能需要超过2块拼图。

#include <bits/stdc++.h>
using namespace std;
#define ll long long

char g[4505][4505];
bool v[4505][4505];

short sum[1505][1505];

int n,m;
int si,sj;

void copy_g(){
    for(int i=n+1;i<=2*n;i++){
        for(int j=m+1;j<=2*m;j++){
            if(g[i][j]=='S'){
                si=i;sj=j;
                g[i][j]='.';
            }
        }
    }

    for(int i=n+1;i<=2*n;i++){
        for(int j=m+1;j<=2*m;j++){
            g[i-n][j]=g[i+n][j]=g[i][j];
            g[i-n][j-m]=g[i-n][j+m]=g[i][j];
            g[i][j-m]=g[i][j+m]=g[i][j];
            g[i+n][j-m]=g[i+n][j+m]=g[i][j];
        }
    }
}

struct cor{
    int i,j;
    cor(int i,int j):i(i),j(j){}
};

queue<cor> q;

int check(int i,int j){
    if(g[i][j]=='#'||v[i][j])
        return 0;

    if(i==0||j==0||i==3*n+1||j==3*m+1)
        return 0;

    v[i][j]=1;
    q.push(cor(i,j));
    return 1;
}

void show(int ii,int jj){
    for(int i=1;i<=3*n;i++){
        for(int j=1;j<=3*m;j++){
            if(i==ii&&j==jj){
                printf("S");
            }
            else{
                if(g[i][j]=='#'||g[i][j]=='.'){
                    printf("%c",g[i][j]);
                }
                else{
                    printf("*");
                }
            }
        }
        printf("\n");
    }
    printf("\n");
}

void bfs(){
    memset(v,0,sizeof(v));
    while(!q.empty())
        q.pop();

    check(si,sj);
    while(!q.empty()){
        int i=q.front().i,j=q.front().j;
        q.pop();

        show(i,j);

        if(check(i-1,j)==-1||check(i+1,j)==-1||check(i,j-1)==-1||check(i,j+1)==-1){
            printf("Yes\n");
            return;
        }
    }

    for(int i=n+1;i<=2*n;i++){
        for(int j=m+1;j<=2*m;j++){
            sum[i-n][j-m]=v[i][j];
            sum[i-n][j-m]+=v[i-n][j]+v[i+n][j];
            sum[i-n][j-m]+=v[i-n][j-m]+v[i-n][j+m];
            sum[i-n][j-m]+=v[i][j-m]+v[i][j+m];
            sum[i-n][j-m]+=v[i+n][j-m]+v[i+n][j+m];
            if(sum[i-n][j-m]>=2){
                printf("Yes\n");
                return;
            }
        }
    }

    printf("No\n");
    return;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=n+1;i<=2*n;i++){
            scanf("%s",(g[i]+m+1));
        }
        copy_g();
        bfs();
    }
}

 

posted @ 2019-03-16 01:59  韵意  阅读(195)  评论(0编辑  收藏  举报