2017.8.1 퍼 즐 도 내 추 필 시험 문제 (4) - 미로 길 찾기 (상태 압축 + BFS)
8493 단어 상용 알고리즘 정리
int n,m,sx,sy,ex,ey;
char g[1024][1024];
int use[120][120][1400];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct node
{
int x,y,k;
};
int bfs()
{
memset(use,0xff,sizeof(use));
queueq;
node t;
t.x=sx;
t.y=sy;
t.k=0;
use[t.x][t.y][t.k]=0;
q.push(t);
while(!q.empty())
{
t = q.front();
q.pop();
//printf("%d %d %d %d
",t.x,t.y,t.k,use[t.x][t.y][t.k]);
if(t.x==ex&&t.y==ey) return use[t.x][t.y][t.k];
for(int i=0;i<4;i++)//
{
node k;//
k.x = t.x + dx[i];
k.y = t.y + dy[i];
k.k = t.k;
if(k.x<0||k.x>=n||k.y<0||k.y>=m||g[k.x][k.y]=='0') continue;//
if(g[k.x][k.y]>='a'&&g[k.x][k.y]<='z')
{
k.k = k.k|(1<.x][k.y]-'a'));//
}
if(g[k.x][k.y]>='A'&&g[k.x][k.y]<='Z')
{
int p = k.k&(1<.x][k.y]-'A'));//
if(p==0) continue;//
}
if(use[k.x][k.y][k.k]==-1||use[k.x][k.y][k.k]>use[t.x][t.y][t.k]+1)// BFS,
{
use[k.x][k.y][k.k]=use[t.x][t.y][t.k]+1;
q.push(k);
}
}
}
return -1;
}
BFS + 상태 압축 이 있 으 면 주 함 수 를 쓰 면 바로 AC 가 됩 니 다.주 함수
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i"%s",g[i]);
for(int j=0;j<m;j++)
{
if(g[i][j]=='2') {sx=i;sy=j;}//
if(g[i][j]=='3') {ex=i;ey=j;}//
}
}
printf("%d
",bfs());
return 0;
}