.
一个错误的思路,认为走到边界就逃出生天了:
错误代码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(); } }