标签:否则 name sed amp 代码 ring 计数 上下 问题
题目链接http://bailian.openjudge.cn/practice/2790/
2 3 .## ..# #.. 0 0 2 2 5 ..... ###.# ..#.. ###.. ...#. 0 0 4 0
YES NO
算法分析
这道题目是典型的迷宫问题。要判断出发点到终止点是否可到达,应该优先考虑广度优先搜索算法。当然,深度优先搜索也可以解决,但是要注意:这里仅仅判断是否可到达,故在深搜过程中不需要回溯。
广搜代码:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 char a[101][101]; 5 int t,n,x,y, 6 fx[5]={0,0,1,0,-1}, 7 fy[5]={0,1,0,-1,0}, 8 rx,ry,cx,cy; 9 bool sfzd,flag,vis[101][101]; 10 void bfs(int i){ 11 for(int j=1;j<=4;j++){ 12 if(a[x+fx[j]][y+fy[j]]==‘.‘&&!vis[x+fx[j]][y+fy[j]]){ 13 x+=fx[j];y+=fy[j]; 14 vis[x][y]=1; 15 if(x==cx&&y==cy) {sfzd=true;flag=true;break;} 16 else bfs(i+1); 17 if(!flag) {x-=fx[j];y-=fy[j];vis[x][y]=0;} 18 else break; 19 } 20 } 21 } 22 int main(){ 23 scanf("%d",&t); 24 while(t--){ 25 scanf("%d",&n); 26 for(int i=0;i<n;i++) 27 for(int j=0;j<n;j++) 28 vis[i][j]=0; 29 for(int i=0;i<n;i++) 30 for(int j=0;j<n;j++) 31 cin>>a[i][j]; 32 cin>>rx>>ry>>cx>>cy; 33 x=rx;y=ry; 34 if(a[x][y]==‘.‘) 35 bfs(1); 36 printf("%s\n",sfzd?"YES":"NO"); 37 sfzd=false;flag=false; 38 } 39 return 0; 40 }
深搜代码一:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int temp=0,n; 6 char a[101][101]; 7 void dfs(int ha,int la,int hb,int lb) 8 { 9 if (ha==hb&&la==lb)//搜索的起点等于终点 10 { 11 temp=1; 12 return; 13 } 14 if (a[ha][la]==‘#‘)//不通 15 return ; 16 a[ha][la]=‘#‘; 17 dfs(ha+1,la,hb,lb);//下 18 dfs(ha,la+1,hb,lb);//右 19 dfs(ha,la-1,hb,lb);//左 20 dfs(ha-1,la,hb,lb);//上 21 } 22 int main() 23 { 24 int k,ha,la,hb,lb; 25 cin>>k; 26 while(k--) 27 { 28 cin>>n; 29 for (int i=0;i<=n+1;i++) 30 for (int j=0;j<=n+1;j++) 31 a[i][j]=‘#‘; 32 for (int i=1;i<=n;i++) 33 for (int j=1;j<=n;j++) 34 cin>>a[i][j]; 35 cin>>ha>>la>>hb>>lb; 36 ha+=1;la+=1;hb+=1;lb+=1; 37 if (a[ha][la]==‘#‘||a[hb][lb]==‘#‘)//有一个不可达 38 { 39 printf("NO\n"); 40 continue; 41 } 42 temp=0; 43 dfs(ha,la,hb,lb); 44 if (temp==0) 45 printf("NO\n"); 46 else 47 printf("YES\n"); 48 } 49 return 0; 50 }
深搜代码二:
1 #include <stdio.h> 2 int n,ha,la,hb,lb; 3 char a[101][101]; 4 int f=0; 5 int dx[4]={-1,1, 0,0};//上下左右 6 int dy[4]={ 0,0,-1,1}; 7 8 void dfs(int x,int y) 9 { 10 int i,xx,yy; 11 if(f==1)return; 12 if(x==hb&&y==lb){ f=1;return ; } 13 for(i=0;i<4;i++) 14 { 15 xx=x+dx[i]; yy=y+dy[i]; 16 if(xx>=0&&xx<n&&yy>=0&&yy<n&&a[xx][yy]==‘.‘&&f==0) 17 { 18 a[xx][yy]=‘#‘; 19 dfs(xx,yy); 20 //a[xx][yy]=‘.‘;//这一行不能要,本题不需要回溯。若是加上这一行会导致超时。 21 } 22 } 23 } 24 int main() 25 { 26 int i,j,k,t; 27 scanf("%d",&t); 28 for(k=0;k<t;k++) 29 { 30 scanf("%d",&n); getchar(); 31 for(i=0;i<n;i++) 32 { 33 for(j=0;j<n;j++) 34 scanf("%c",&a[i][j]); 35 getchar(); 36 } 37 scanf("%d%d%d%d",&ha,&la,&hb,&lb); 38 39 /*printf("%d\n",n); 40 for(i=0;i<n;i++) 41 { 42 for(j=0;j<n;j++) 43 printf("%c",a[i][j]); 44 printf("\n"); 45 } 46 printf("%d %d %d %d\n",ha,la,hb,lb);*/ 47 48 if(a[ha][la]==‘#‘||a[hb][lb]==‘#‘) { printf("NO\n"); continue; } 49 a[ha][la]=‘#‘; 50 f=0; 51 dfs(ha,la); 52 if(f==1)printf("YES\n"); 53 else printf("NO\n"); 54 } 55 return 0; 56 }
标签:否则 name sed amp 代码 ring 计数 上下 问题
原文地址:https://www.cnblogs.com/huashanqingzhu/p/10630151.html