POJ 3026 Borg Maze(BFS+최소 생 성 트 리)
이 문 제 는 S 와 A 를 같은 점 으로 볼 수 있다.최소 생 성 트 리 의 성질 에 따라 출발점 이 어디 에 있 든 같 기 때문이다.그리고 각 지점 에서 나머지 지점 까지 의 거 리 는 BFS 로 검색 할 수 있 으 며 검색 과정 에서 거 리 를 행렬 로 저장 합 니 다.그리고 모든 거 리 를 얻 은 후에 prim 알고리즘 으로 최소 생 성 트 리 를 구 합 니 다.
코드 는 다음 과 같 습 니 다:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include<algorithm>
using namespace std;
int n, m, a[60][60], map[110][110], d[110], vis1[110][110], vis[110], maxint=100000, num;
char st[60][60];
int jx[]={0,0,1,-1};
int jy[]={1,-1,0,0};
struct node
{
int x, y, ans;
}fei[10000000];
void bfs(int x, int y, int q)
{
int i, j, s=0, e=0, xx=0;
node f1, f2;
f1.x=x;
f1.y=y;
f1.ans=0;
fei[s++]=f1;
vis1[x][y]=1;
while(s>e)
{
f1=fei[e++];
if(a[f1.x][f1.y]!=0&&a[f1.x][f1.y]!=q)
{
map[q][a[f1.x][f1.y]]=map[a[f1.x][f1.y]][q]=f1.ans;
xx++;
if(xx==num-1)
{
return ;
}
}
for(i=0;i<4;i++)
{
f2.x=f1.x+jx[i];
f2.y=f1.y+jy[i];
if(f2.x>=0&&f2.x<n&&f2.y>=0&&f2.y<m&&!vis1[f2.x][f2.y]&&(st[f1.x][f1.y]=='A'||st[f1.x][f1.y]=='S'||st[f1.x][f1.y]==' '))
{
vis1[f2.x][f2.y]=1;
f2.ans=f1.ans+1;
fei[s++]=f2;
}
}
}
return ;
}
void prim()
{
int ans=0, i, j, pos, min1;
for(i=2;i<=num;i++)
{
d[i]=map[1][i];
}
vis[1]=1;
for(i=1;i<num;i++)
{
min1=maxint;
for(j=2;j<=num;j++)
{
if(!vis[j]&&min1>d[j])
{
min1=d[j];
pos=j;
}
}
vis[pos]=1;
ans+=min1;
for(j=2;j<=num;j++)
{
if(!vis[j]&&d[j]>map[pos][j])
{
d[j]=map[pos][j];
}
}
}
printf("%d
",ans);
}
int main()
{
int t, i, j, k, p, q;
scanf("%d",&t);
while(t--)
{
scanf("%d%d ",&m,&n);
k=1;
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
num=0;
for(i=0; i<n; i++)
{
gets(st[i]);
for(j=0; j<m; j++)
{
if(st[i][j]=='A'||st[i][j]=='S')
{
a[i][j]=k++;
num++;
}
}
}
for(i=1;i<=num;i++)
{
for(j=1;j<=num;j++)
{
map[i][j]=maxint;
}
}
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(a[i][j])
{
memset(vis1,0,sizeof(vis1));
q=a[i][j];
bfs(i,j,q);
}
}
}
prim();
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux Shell 프로 그래 밍 - 텍스트 처리 grep, sed사용자 가 지정 한 '모드' 에 따라 대상 텍스트 를 일치 하 게 검사 하고 일치 하 는 줄 을 인쇄 합 니 다. ##포함 되 지 않 음, 역방향 일치 \ ##키워드 앞 뒤 가 맞지 않 고 키워드 만 일치 합 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.