迷宫寻宝(一)
http://acm.nyist.net/JudgeOnline/problem.php?pid=82
利用bfs来进行深度搜索,不过我的这个程序写得很烂
这是我的:
#include"stdio.h"
#include"string.h"
int v[22][22],q1[409],q2[409],key[6],newx[4]={-1,0,1,0},newy[4]={0,-1,0,1},n,m,flat,si,sj,doorx[409],doory[409],from1,to1;
int sum1,sum2,sum3,sum4,sum5;//每个钥匙的总量
char map[22][22];
void bfs1(int to1)//to1如果不传过来竟然是0,我开的是全局变量!!!
{
int from=0,to=0,k=0,nx,ny,h=0,i,j,num=2;
for(num=2;num>=1;num--)//第一个循环是查找在某些门后的钥匙,第二次循环是看是否能够找到宝藏
{
for(h=0;h<=to1-1;h++)
{
if((map[doorx[h]][doory[h]]=='A'&&key[1]==sum1)||(map[doorx[h]][doory[h]]=='B'&&key[2]==sum2)||(map[doorx[h]][doory[h]]=='C'&&key[3]==sum3)||(map[doorx[h]][doory[h]]=='D'&&key[4]==sum4)||(map[doorx[h]][doory[h]]=='E'&&key[5]==sum5))
{
q1[to]=doorx[h];
q2[to++]=doory[h];
while(from<=to)
{
i=q1[from];
j=q2[from++];
for(k=0;k<4;k++)
{
nx=i+newx[k];
ny=j+newy[k];
if(map[nx][ny]=='G')
flat=1;
if(!v[nx][ny])
{
if(map[nx][ny]=='a'||map[nx][ny]=='b'||map[nx][ny]=='c'||map[nx][ny]=='d'||map[nx][ny]=='e'||map[nx][ny]=='.')
{
v[nx][ny]=1;
if(map[nx][ny]=='a')
key[1]+=1;
else if(map[nx][ny]=='b')
key[2]+=1;
else if(map[nx][ny]=='c')
key[3]+=1;
else if(map[nx][ny]=='d')
key[4]+=1;
else if(map[nx][ny]=='e')
key[5]+=1;
q1[to]=nx;
q2[to++]=ny;
}
else if((map[nx][ny]=='A'&&sum1==key[1])||(map[nx][ny]=='B'&&sum2==key[2])||(map[nx][ny]=='C'&&sum3==key[3])||(map[nx][ny]=='D'&&sum4==key[4])||(map[nx][ny]=='E'&&sum5==key[5]))
{
v[nx][ny]=1;
q1[to]=nx;
q2[to++]=ny;
}
}
}
}
}
}
}
}
void bfs(int i,int j)//第一次查找钥匙
{
int from=0,to=0,k,nx,ny,to1=0;
q1[to]=i;
q2[to++]=j;
while(from<=to)
{
i=q1[from];
j=q2[from++];
for(k=0;k<4;k++)
{
nx=i+newx[k];
ny=j+newy[k];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&map[nx][ny]!='X'&&!v[nx][ny])
{
if(map[nx][ny]=='G')
{
flat=1;
}
else if(map[nx][ny]=='a'||map[nx][ny]=='b'||map[nx][ny]=='c'||map[nx][ny]=='d'||map[nx][ny]=='e'||map[nx][ny]=='.')
{
v[nx][ny]=1;
if(map[nx][ny]=='a')
key[1]+=1;
else if(map[nx][ny]=='b')
key[2]+=1;
else if(map[nx][ny]=='c')
key[3]+=1;
else if(map[nx][ny]=='d')
key[4]+=1;
else if(map[nx][ny]=='e')
key[5]+=1;
q1[to]=nx;
q2[to++]=ny;
}
else if((map[nx][ny]=='A'&&sum1==key[1])||(map[nx][ny]=='B'&&sum2==key[2])||(map[nx][ny]=='C'&&key[3]==sum3)||(map[nx][ny]=='D'&&sum4==key[4])||(map[nx][ny]=='E'&&key[5]==sum5))
{
v[nx][ny]=1;
q1[to]=nx;
q2[to++]=ny;
}
else
{
doorx[to1]=nx;
doory[to1++]=ny;
}
}
if(flat)
break;
}
if(flat)
break;
}
if(!flat)
{
bfs1(to1);
}
if(!flat)
printf("NO\n");
else
printf("YES\n");
}
int main()
{
int i,j;
char ch;
while(scanf("%d%d",&n,&m),n!=0&&m!=0)
{
flat=0;
sum1=0;sum2=0;sum3=0;sum4=0;sum5=0;
ch=getchar();
for(i=0;i<n;i++)//注意标准输入的每行后面有空格,单个字符读取的话,你就悲剧了。。。。
{
scanf("%s",map[i]);
for(j=0;j<m;j++)
{
if(map[i][j]=='a')
sum1++;
else if(map[i][j]=='b')
sum2++;
else if(map[i][j]=='c')
sum3++;
else if(map[i][j]=='d')
sum4++;
else if(map[i][j]=='e')
sum5++;
else if(map[i][j]=='S')
{
si=i;sj=j;
}
}
}
memset(key,0,sizeof(key));
memset(v,0,sizeof(v));
memset(q1,0,sizeof(q1));
memset(q2,0,sizeof(q2));
bfs(si,sj);
}
return 0;
}
这里附上标程的代码:
#include<iostream>
#include<vector>
using namespace std;
const int MAX=22;
char maze[MAX][MAX]={0};
bool visited[MAX][MAX]={0};
vector<int> findkey(5,0);
vector<int> keynum(5,0);
vector<int> doorx(5,-1);
vector<int> doory(5,-1);
void DFS(int m,int n)
{
if(!visited[m][n]&&maze[m][n]!=0 && maze[m][n]!='X')
{
if(maze[m][n]=='G') throw true;
if(maze[m][n]>='A'&&maze[m][n]<='E') {
doorx[maze[m][n]-'A']=m;doory[maze[m][n]-'A']=n;if(keynum[maze[m][n]-'A']!=findkey[maze[m][n]-'A']) return;}
visited[m][n]=true;
if(maze[m][n]>='a'&&maze[m][n]<='e')
{
++findkey[maze[m][n]-'a'];
if(doorx[maze[m][n]-'a']!=-1) DFS(doorx[maze[m][n]-'a'],doory[maze[m][n]-'a']);
}
DFS(m-1,n);DFS(m+1,n);DFS(m,n-1);DFS(m,n+1);
}
}
void clear()
{
findkey.assign(5,0);
keynum.assign(5,0);
doorx.assign(5,-1);
doory.assign(5,-1);
for(int i=0;i!=MAX;i++)
for(int j=0;j!=MAX;j++)
{
maze[i][j]=0;
visited[i][j]=0;
}
}
int main()
{
int row,col,startx,starty;
while(cin>>row>>col)
{
if(row==0 && col==0) break;
for(int i=1;i<=row;++i)
{
for(int j=1;j<=col;++j)
{
cin>>maze[i][j];
if(maze[i][j]=='S')
{
startx=i;starty=j;
}
if(maze[i][j]>='a' &&maze[i][j]<='e')
++keynum[maze[i][j]-'a'];
}
}
try
{
DFS(startx,starty);
cout<<"NO"<<endl;
}
catch(...)
{
cout<<"YES"<<endl;
}
clear();
}
}