NYOJ 82

View Code
  1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<queue>
5 using namespace std;
6
7 struct node
8 {
9 int x,y;
10 }pace[1000];
11 queue <node> q;
12 bool flag[21][21];//标记各个点是否走过
13 char map[21][100];//迷宫
14 int num[6];//各个门的总钥匙数
15 int have[6];//已经取得钥匙数
16 node door[6];//存放经过的门但尚不可入的
17 int sm,sn;//起点坐标
18 int em,en;//宝藏坐标
19 int m,n;
20 int k=0;//pace 使用进度
21 int a=0; //记录经过的门的数目
22
23 void init()
24 {
25 int i,j;
26 memset(num,0,sizeof(num));
27 memset(flag,0,sizeof(flag));
28 memset(have,0,sizeof(have));
29 for(i=0;i<m;++i)
30 scanf("%s",map[i]);
31 for(i=0;i<m;++i)
32 for(j=0;j<n;++j)
33 {
34 if(map[i][j]=='S')//起点坐标
35 {
36 sm=i;
37 sn=j;
38 }
39 if(map[i][j]=='G')//终点坐标
40 {
41 em=i;
42 en=j;
43 }
44 if(map[i][j]>='a'&&map[i][j]<='e')//各个钥匙数目
45 {
46 num[map[i][j]-'a']++;
47 }
48 }
49 }
50
51 void search()
52 {
53 while(!q.empty())
54 q.pop();
55 pace[k].x=sm;//起点入栈
56 pace[k].y=sn;
57 flag[sm][sn]=1;
58 q.push(pace[k]);
59 k++;
60 while(1)
61 {
62 while(!q.empty())
63 {
64 node t=q.front();
65 q.pop();
66 int i=t.x;
67 int j=t.y;
68 if(i==em&&j==en)
69 {
70 printf("YES\n");
71 return;
72 }
73 if(i>0&&!flag[i-1][j]&&map[i-1][j]!='X')
74 {
75 bool f=1;
76 if(map[i-1][j]>='A'&&map[i-1][j]<='E')
77 {//若是门看现有的钥匙量能否打开门
78 if(have[map[i-1][j]-'A']!=num[map[i-1][j]-'A'])
79 {
80 f=0;//打不开门把这个门的位置记录下
81 door[a].x=i-1;
82 door[a].y=j;
83 a++;
84 }
85 }
86 if(map[i-1][j]>='a'&&map[i-1][j]<='e')
87 have[map[i-1][j]-'a']++;
88 if(f)
89 {
90 flag[i-1][j]=1;
91 pace[k].x=i-1;
92 pace[k].y=j;
93 q.push(pace[k]);
94 k++;
95 }
96
97 }
98 if(i<m-1&&!flag[i+1][j]&&map[i+1][j]!='X')
99 {
100 bool f=1;
101 if(map[i+1][j]>='A'&&map[i+1][j]<='E')
102 {
103 if(have[map[i+1][j]-'A']!=num[map[i+1][j]-'A'])
104 {
105 f=0;
106 door[a].x=i+1;
107 door[a].y=j;
108 a++;
109 }
110 }
111 if(map[i+1][j]>='a'&&map[i+1][j]<='e')
112 have[map[i+1][j]-'a']++;
113 if(f)
114 {
115 flag[i+1][j]=1;
116 pace[k].x=i+1;
117 pace[k].y=j;
118 q.push(pace[k]);
119 k++;
120 }
121
122 }
123 if(j>0&&!flag[i][j-1]&&map[i][j-1]!='X')
124 {
125 bool f=1;
126 if(map[i][j-1]>='A'&&map[i][j-1]<='E')
127 {
128 if(have[map[i][j-1]-'A']!=num[map[i][j-1]-'A'])
129 {
130 f=0;
131 door[a].x=i;
132 door[a].y=j-1;
133 a++;
134 }
135 }
136 if(map[i][j-1]>='a'&&map[i][j-1]<='e')
137 have[map[i][j-1]-'a']++;
138 if(f)
139 {
140 flag[i][j-1]=1;
141 pace[k].x=i;
142 pace[k].y=j-1;
143 q.push(pace[k]);
144 k++;
145 }
146
147 }
148 if(j<n-1&&!flag[i][j+1]&&map[i][j+1]!='X')
149 {
150 bool f=1;
151 if(map[i][j+1]>='A'&&map[i][j+1]<='E')
152 {
153 if(have[map[i][j+1]-'A']!=num[map[i][j+1]-'A'])
154 {
155 f=0;
156 door[a].x=i;
157 door[a].y=j+1;
158 a++;
159 }
160 }
161 if(map[i][j+1]>='a'&&map[i][j+1]<='e')
162 have[map[i][j+1]-'a']++;
163 if(f)
164 {
165 flag[i][j+1]=1;
166 pace[k].x=i;
167 pace[k].y=j+1;
168 q.push(pace[k]);
169 k++;
170 }
171
172 }
173 }
174 bool ft=0;//此时把能遍历的都遍历了,看能到达的门是否能打开
175 int i;
176 for(i=0;i<a;++i)
177 {
178 int xm=door[i].x;
179 int yn=door[i].y;
180 int te=map[xm][yn]-'A';
181 if(num[te]==have[te]&&!flag[xm][yn])
182 {//能打开门 则压入栈中 可以从这个门进入继续访问
183 ft=1;
184 flag[xm][yn]=1;
185 pace[k].x=xm;
186 pace[k].y=yn;
187 q.push(pace[k]);
188 k++;
189 }
190 }
191 if(!ft)//若没有能打开 栈为空 表示不能找到
192 {
193 printf("NO\n");
194 return ;
195 }
196 }
197 }
198
199 int main()
200 {
201 while(scanf("%d%d",&m,&n)&&(m||n))
202 {
203 k=0;
204 a=0;
205 init();//初始化,及输入各个数据
206 search();
207 }
208 system("pause");
209 return 0;
210 }

 

posted @ 2012-02-17 19:46  知行执行  阅读(469)  评论(0编辑  收藏  举报