nyoj 82 迷宫寻宝(一)

初次写这道题一直在想怎么一遍将这个题的所有情况搜一遍,如果一遍搜完的话,肯定要走回头的路,可是走过的路要标记,该如何解决?一直想不通,后来听同学说可以多搜几遍,顿时豁然开朗,写着写着又发现,怎么才能搜第二编的时候不再搜到原先已经搜到的钥匙?问了学长,才明白应该在while循环里面在写个for循环来再将地图更改一下,这样就好了,自己写的过程中bug出现好多,幸亏自己看出来了。

多遍广搜即可,代码贴上:

01. #include<stdio.h>
02. #include<string.h>
03. #include<queue>
04. using namespace std;
05. int fx[4][2]= {0,1,0,-1,1,0,-1,0},f=0,yszong[10],ys[10];
06. char map[25][25],mapp[25][25];
07. struct stu
08. {
09. int x,y;
10. } s;
11. void bfs(stu s)
12. {
13. queue<stu>q;
14. stu t;
15. q.push(s);
16. while(!q.empty())
17. {
18. int i;
19. s=q.front();
20. q.pop();
21. if(map[s.x][s.y]>='a'&&map[s.x][s.y]<='e')
22. ys[map[s.x][s.y]-'a']++,map[s.x][s.y]='.';
23. if(map[s.x][s.y]=='G')
24. {
25. f=1;
26. break;
27. }
28. if(map[s.x][s.y]>='A'&&map[s.x][s.y]<='E'&&(yszong[map[s.x][s.y]-'A']==ys[map[s.x][s.y]-'A']))
29. map[s.x][s.y]='.';
30. if(map[s.x][s.y]=='.')
31. for(i=0; i<4; i++)
32. {
33. map[s.x][s.y]='X';
34. t.x=s.x+fx[i][0];
35. t.y=s.y+fx[i][1];
36. if(map[t.x][t.y]!='X')
37. q.push(t);
38. }
39. }
40. }
41. int main()
42. {
43. int n,m;
44. while(scanf("%d%d",&n,&m)&&(n||m))
45. {
46. memset(map,0,sizeof(map));
47. memset(yszong,0,sizeof(yszong));
48. memset(ys,0,sizeof(ys));
49. int i,j;
50. for(i=1; i<=n; i++)
51. {
52. getchar();
53. for(j=1; j<=m; j++)
54. {
55. scanf("%c",&map[i][j]);
56. if(map[i][j]=='S')
57. s.x=i,s.y=j,map[i][j]='.';
58. if(map[i][j]>='a'&&map[i][j]<='e')
59. yszong[map[i][j]-'a']++;
60. }
61. }
62. memcpy(mapp,map,sizeof(map));
63. int ci=2;
64. f=0;
65. while(ci--)
66. {
67. bfs(s);
68. for(i=1; i<=n; i++)
69. for(j=1; j<=m; j++)
70. {
71. if(map[i][j]=='X'&&mapp[i][j]=='.')
72. map[i][j]='.';
73. if(map[i][j]=='X'&&mapp[i][j]>='a'&&mapp[i][j]<='e')
74. map[i][j]='.';
75. if(f)
76. break;
77. }
78. }
79. if(f)
80. printf("YES\n");
81. else
82. printf("NO\n");
83. }
84. }


你可能感兴趣的:(广搜,nyoj日常小练)