POJ 3026 Borg Maze

来源:互联网 发布:理光mpc3300额外端口 编辑:程序博客网 时间:2024/04/29 10:40

题目大意:

给你一个地图,求由地图上S点到其他点A的最短路径。

代码操作步骤:

1、记录下所有的A和S的位置。

2、BFS求出任意两点之间的最短路程,建立邻接矩阵。

3、Prim算法求最小生成树。

下面是代码:

#include <stdio.h>#include <string.h>#include <queue>using namespace std;const int M=105;struct node1{    int x,y,cut,in;} node[M],du,dc;bool map2[M][M][M];int map1[M][M],n,x,y;char s[55][55];#define typec int // type of costconst typec inf = 0x3f3f3f3f; // max of costint vis[M];typec lowc[M];int find1(int x,int y){    for(int i=0; i<n; i++)    {        if(node[i].x==x&&node[i].y==y)        {            return i;        }    }}void bfs(){    int i;    memset(map2,0,sizeof(map2));    queue <struct node1> qu;    for(i=0; i<n; i++)    {        qu.push(node[i]);        map1[i][i]=0;        map2[node[i].x][node[i].y][i]=1;    }    while(!qu.empty())    {        du=qu.front();        qu.pop();        if(du.x>0&&s[du.x-1][du.y]!='#'&&!map2[du.x-1][du.y][du.in])        {            dc.x=du.x-1;            dc.y=du.y;            dc.cut=du.cut+1;            dc.in=du.in;            if(s[du.x-1][du.y]=='S'||s[du.x-1][du.y]=='A')            {                map1[du.in][find1(du.x-1,du.y)]=dc.cut;            }            qu.push(dc);            map2[du.x-1][du.y][du.in]=1;        }        if(du.x+1<y&&s[du.x+1][du.y]!='#'&&!map2[du.x+1][du.y][du.in])        {            dc.x=du.x+1;            dc.y=du.y;            dc.cut=du.cut+1;            dc.in=du.in;            if(s[du.x+1][du.y]=='S'||s[du.x+1][du.y]=='A')            {                map1[du.in][find1(du.x+1,du.y)]=dc.cut;            }            qu.push(dc);            map2[du.x+1][du.y][du.in]=1;        }        if(du.y>0&&s[du.x][du.y-1]!='#'&&!map2[du.x][du.y-1][du.in])        {            dc.x=du.x;            dc.y=du.y-1;            dc.cut=du.cut+1;            dc.in=du.in;            if(s[du.x][du.y-1]=='S'||s[du.x][du.y-1]=='A')            {                map1[du.in][find1(du.x,du.y-1)]=dc.cut;            }            qu.push(dc);            map2[du.x][du.y-1][du.in]=1;        }        if(du.y+1<x&&s[du.x][du.y+1]!='#'&&!map2[du.x][du.y+1][du.in])        {            dc.x=du.x;            dc.y=du.y+1;            dc.cut=du.cut+1;            dc.in=du.in;            if(s[du.x][du.y+1]=='S'||s[du.x][du.y+1]=='A')            {                map1[du.in][find1(du.x,du.y+1)]=dc.cut;            }            qu.push(dc);            map2[du.x][du.y+1][du.in]=1;        }    }}typec prim(typec cost[][M]) // vertex: 0 ~ n-1{    int i, j, p;    typec minc, res = 0;    memset(vis, 0, sizeof(vis));    vis[0] = 1;    for (i=1; i<n; i++)    {        lowc[i] = cost[0][i];    }    for (i=1; i<n; i++)    {        minc = inf;        p = -1;        for (j=0; j<n; j++)        {            if (0 == vis[j] && minc > lowc[j])            {                minc = lowc[j];                p = j;            }        }        res+=minc;        vis[p] = 1;        for (j=0; j<n; j++)        {            if (0 == vis[j] && lowc[j] > cost[p][j])            {                lowc[j] = cost[p][j];            }        }    }    return res;}int main(){    int i,j,t;    scanf("%d",&t);    while(t--)    {        n=0;        char temp[200];        scanf("%d%d",&x,&y);        gets(temp);        for(i=0; i<y; i++)        {            gets(s[i]);        }        for(i=0; i<y; i++)        {            for(j=0; j<x; j++)            {                if(s[i][j]=='A'||s[i][j]=='S')                {                    node[n].x=i;                    node[n].y=j;                    node[n].in=n;                    node[n].cut=0;                    n++;                }            }        }        bfs();        printf("%d\n",prim(map1));    }    return 0;}