• .


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

    错误代码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("
    ");
        }
        printf("
    ");
    }
    
    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
    ");
                return;
            }
        }
    
        printf("No
    ");
        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("
    ");
        }
        printf("
    ");
    }
    
    /*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
    ");
                return;
            }
        }
    
        printf("No
    ");
        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
    ");
            else
                printf("No
    ");
        }
    }

    以为走过迷宫的格子再走过就可以,没想到可能需要超过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("
    ");
        }
        printf("
    ");
    }
    
    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
    ");
                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
    ");
                    return;
                }
            }
        }
    
        printf("No
    ");
        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();
        }
    }
  • 相关阅读:
    zabbix
    amoeba 读写分离
    部署MySQL-主从异步复制
    MySQL 基本操作
    mysql 完整备份和恢复
    正则匹配表达式各个符文表达的意义
    Include和require的区别
    nosql和Mysql的区别
    Git与SVN的区别
    mongodb与mysql区别
  • 原文地址:https://www.cnblogs.com/Yinku/p/10540486.html
Copyright © 2020-2023  润新知