poj3026 Borg Maze

來源:互聯網
上載者:User

題目蠻簡單的。思路:先用bfs求任意兩點之間的最短距離(這裡的兩點指的是A或者是S),然後求最小產生樹,即為答案。

這裡有一個250的地方,就是在x,y之後要用gets()。

#include<iostream><br />#include<cstdio><br />using namespace std;<br />#define N 105<br />#define M 55<br />#define max_int 99999999<br />int cost[N][N],dist[N];<br />int map[M][M];<br />char maze[M][M];<br />bool vis[M][M],s[N];<br />struct node<br />{<br />int i,j,step;<br />};<br />node que[M*M],original,p[N];<br />int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};<br />int choose(int n)<br />{<br />int m=max_int,pos=-1;<br />for(int i=0;i<n;i++)<br />if(dist[i]<m&&!s[i])<br />{<br />m=dist[i];<br />pos=i;<br />}<br />return pos;<br />}<br />void prim(int n,int v)<br />{<br />int u,weight=0,i;<br />memset(s,0,sizeof(s));<br />for(i=0;i<n;i++)<br />dist[i]=max_int;<br />dist[v]=0;<br />while(1)<br />{<br />u=choose(n);<br />if(u==-1)<br />break;<br />weight+=dist[u];<br />s[u]=1;<br />for(i=0;i<n;i++)<br />if(!s[i]&&dist[i]>cost[u][i])<br />dist[i]=cost[u][i];<br />}<br />printf("%d/n",weight);<br />return ;<br />}<br />void bfs(int s_i,int s_j)<br />{<br />int front=-1,rear=0,i,next_i,next_j;<br />node temp,add;<br />memset(vis,0,sizeof(vis));<br />que[0].i=s_i,que[0].j=s_j,que[0].step=0;<br />vis[s_i][s_j]=1;<br />while(front<rear)<br />{<br />temp=que[++front];<br />for(i=0;i<4;i++)<br />{<br />next_i=temp.i+dir[i][0];<br />next_j=temp.j+dir[i][1];<br />if(maze[next_i][next_j]!='#'&&!vis[next_i][next_j])<br />{<br />vis[next_i][next_j]=1;<br />add.i=next_i;<br />add.j=next_j;<br />add.step=temp.step+1;<br />que[++rear]=add;<br />}<br />}<br />}<br />for(i=1;i<=rear;i++)<br />if(maze[que[i].i][que[i].j]=='A'||maze[que[i].i][que[i].j]=='S')<br />cost[map[que[0].i][que[0].j]][map[que[i].i][que[i].j]]=<br />cost[map[que[i].i][que[i].j]][map[que[0].i][que[0].j]]=<br />que[i].step;<br />return ;<br />}<br />void init(int n)<br />{<br />int i,j,k;<br />for(i=0;i<n;i++)<br />for(j=i;j<n;j++)<br />cost[i][j]=cost[j][i]=max_int;<br />for(k=0;k<n;k++)<br />map[p[k].i][p[k].j]=k;<br />for(k=0;k<n;k++)<br />bfs(p[k].i,p[k].j);<br />return ;<br />}<br />int main()<br />{<br />int ca,x,y,i,j,k;<br />char line[M];<br />scanf("%d",&ca);<br />while(ca--)<br />{<br />k=0;<br />scanf("%d%d",&x,&y);<br />gets(line);<br />for(i=1;i<=y;i++)<br />{<br />for(j=1;j<=x;j++)<br />{<br />maze[i][j]=getchar();<br /> if(maze[i][j]=='A'||maze[i][j]=='S')<br /> {<br /> p[k].i=i;<br /> p[k].j=j;<br /> k++;<br /> }<br /> if(maze[i][j]=='S')<br /> {<br /> original.i=i;<br /> original.j=j;<br /> }<br />}<br />getchar();<br />}<br />init(k);<br />prim(k,map[original.i][original.j]);<br />}<br />return 0;<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.