博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迷宫寻宝(搜索)
阅读量:4633 次
发布时间:2019-06-09

本文共 6025 字,大约阅读时间需要 20 分钟。

迷宫寻宝(一)

时间限制:
1000 ms  |  内存限制:65535 KB
难度:
4
 
描述

一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。

 

 
输入
输入可能会有多组测试数据(不超过10组)。
每组测试数据的第一行包含了两个整数M,N(1<N,M<20),分别代表了迷宫的行和列。接下来的M每行有N个字符,描述了迷宫的布局。其中每个字符的含义如下:
.表示可以走的路
S:表示ACM的出发点
G表示宝藏的位置
X表示这里有墙,ACM无法进入或者穿过。
A,B,C,D,E表示这里是门,a,b,c,d,e表示对应大写字母的门上的钥匙。
注意ACM只能在迷宫里向上下左右四个方向移动。
最后,输入0 0表示输入结束。
输出
每行输出一个YES表示ACM能找到宝藏,输出NO表示ACM找不到宝藏。
样例输入
4 4 S.X. a.X. ..XG .... 3 4 S.Xa .aXB b.AG 0 0
样例输出
YES NO 一直找不到WA点,此题测试数据有问题,两个AC代码所得结果不同
1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 struct gate 7 { 8 char name; 9 int num; 10 }men[5]; 11 int dirx[4]={
0,0,-1,1}; 12 int diry[4]={
1,-1,0,0}; 13 char map[21][21]; 14 int m,n; 15 int Num[5]; 16 char cha[6]="abcde"; 17 int sx,sy,gx,gy; 18 bool flag=0; 19 int visi[21][21]; 20 void init() 21 { 22 memset(Num,0,sizeof(Num)); 23 memset(visi,0,sizeof(visi)); 24 memset(map,0,sizeof(map)); 25 for(int i=0;i<5;i++) 26 men[i].name=cha[i]; 27 for(int i=0;i<5;i++) 28 men[i].num=0; 29 flag=0; 30 } 31 int dfs(int x,int y) /*去找钥匙*/ 32 { 33 int i,j; 34 if(x<0||x>=m||y>=n||y<0||visi[x][y]||map[x][y]=='X') 35 return 0; 36 for(i=0;i<5;i++) 37 { 38 if((cha[i]-('a'-'A'))==map[x][y]) 39 { 40 if(Num[i]!=men[i].num) 41 return 0; 42 if(Num[i]==0&&men[i].num==0) 43 return 0; 44 map[x][y]='.'; 45 } 46 47 } 48 visi[x][y]=1; 49 for(i=0;i<5;i++) 50 { 51 if(map[x][y]==cha[i]) 52 { 53 Num[i]++; 54 map[x][y]='.'; 55 } 56 } 57 for(i=0;i<4;i++) 58 { 59 int dx=x+dirx[i]; 60 int dy=y+diry[i]; 61 dfs(dx,dy); 62 } 63 return 0; 64 } 65 int judge(int x,int y) 66 { 67 for(int i=0;i<5;i++) 68 if(map[x][y]==(cha[i]-('a'-'A'))) 69 { 70 if(Num[i]==men[i].num) 71 { 72 if(Num[i]==0) 73 return 1; 74 map[x][y]='.'; 75 return 0; 76 } 77 else 78 return 1; 79 } 80 return 0; /*能走*/ 81 } 82 void DFS(int x,int y) 83 { 84 int i,j; 85 if(x<0||x>=m||y>=n||y<0||map[x][y]=='X'||judge(x,y)) 86 return; 87 if(flag) 88 return; 89 if(x==gx&&y==gy) 90 { 91 flag=1; 92 //cout<<"zhong"; 93 // cout<
<
<
>m>>n)120 {121 if(m==0&&n==0)122 break;123 init();124 for(i=0;i
>map[i][j];129 if(map[i][j]=='S'){sx=i,sy=j;}130 if(map[i][j]=='G'){gx=i,gy=j;}131 for(k=0;k<5;k++) //求各钥匙实际数目132 if(map[i][j]==cha[k])133 men[k].num++; 134 }135 }136 /*for(i=0;i<5;i++)137 cout<
<<" ";138 cout<

别人的AC代码

1 #include 
2 #include
3 4 using namespace std; 5 6 struct node 7 { 8 int x; 9 int y; 10 int num; 11 }q[5]; 12 char map[25][25]; 13 int maxkeyOfDoor[5]; //存储打开一个门所有的钥匙数 14 int findkeyOfDoor[5]; //存储现今已经找到的钥匙数 15 bool flag; 16 17 void DFS(int i, int j); 18 void check(); 19 20 void DFS(int i, int j) 21 { 22 if(map[i][j] != 'X') 23 { 24 switch (map[i][j]) 25 { 26 case 'a': 27 case 'b': 28 case 'c': 29 case 'd': 30 case 'e': 31 ++findkeyOfDoor[map[i][j]-'a']; 32 break; 33 case 'A': 34 case 'B': 35 case 'C': 36 case 'D': 37 case 'E': 38 q[map[i][j] - 'A'].x = i; 39 q[map[i][j] - 'A'].y = j; 40 ++q[map[i][j] - 'A'].num; 41 return; 42 case 'G': 43 flag = true; 44 return; 45 } 46 map[i][j] = 'X'; // 标记为已走 47 DFS(i-1, j); 48 DFS(i+1, j); 49 DFS(i, j-1); 50 DFS(i, j+1); 51 check(); 52 } 53 } 54 55 void check() 56 { 57 for(int i = 0; i < 5; ++i) 58 { 59 if(q[i].num) 60 { 61 if(findkeyOfDoor[i] == maxkeyOfDoor[i]) //说明打开该门所需的钥匙已经全部找到,即可以打开门 62 { 63 map[q[i].x][q[i].y] = 'X'; 64 DFS(q[i].x-1, q[i].y); 65 DFS(q[i].x+1, q[i].y); 66 DFS(q[i].x, q[i].y-1); 67 DFS(q[i].x, q[i].y+1); 68 } 69 } 70 } 71 } 72 73 int main() 74 { 75 int tx, ty, m, n; 76 // freopen("in.txt","r",stdin); 77 while(cin >> m >> n && (m || n)) 78 { 79 flag = false; 80 memset(maxkeyOfDoor, 0, sizeof(maxkeyOfDoor)); 81 memset(findkeyOfDoor, 0, sizeof(findkeyOfDoor)); 82 memset(q, 0, sizeof(q)); 83 /* 84 for(int i = 0; i <= m + 1; ++i) 85 map[i][0] = map[i][n + 1] = 'X'; 86 for(int i = 0; i <= n + 1; ++i) 87 map[0][i] = map[m + 1][i] = 'X'; //添加两个fou循环可以防止越界 88 */ 89 memset(map, 'X', sizeof(map)); //这样写也可以提交 90 91 for(int i = 1; i <= m; ++i) 92 { 93 for(int j = 1; j <= n; ++j) 94 { 95 cin >> map[i][j]; 96 if(map[i][j] == 'S') 97 { 98 tx = i; 99 ty = j;100 }101 else if(map[i][j] >= 'a' && map[i][j] <= 'e')102 ++maxkeyOfDoor[map[i][j] - 'a'];103 }104 }105 DFS(tx, ty);106 if(flag)107 cout << "YES" << endl;108 else109 cout << "NO" << endl;110 }111 return 0;112 }

 

转载于:https://www.cnblogs.com/a1225234/p/4899635.html

你可能感兴趣的文章
CF 1029E Tree with Small Distances
查看>>
LOJ 2537 「PKUWC2018」Minimax
查看>>
location.origin兼容IE
查看>>
[BZOJ1602] [Usaco2008 Oct] 牧场行走 (LCA)
查看>>
中间件笔记
查看>>
[SDOI2009]晨跑
查看>>
oracleHelper 操作帮助类
查看>>
TPS与QPS
查看>>
使用java中replaceAll方法替换字符串中的反斜杠
查看>>
如何释放电脑被限制的20%网速?
查看>>
Android初学第36天
查看>>
RabbitMQ队列监控
查看>>
Some configure
查看>>
.net core 中的[FromBody]
查看>>
java学习之成员内部类
查看>>
json_encode时中文编码转正常状态
查看>>
流量调整和限流技术 【转载】
查看>>
Android WebView使用与JavaScript使用
查看>>
Axure 全局辅助线(转)
查看>>
图论之tarjan缩点
查看>>