1321. Robot

 2023-09-05 阅读 16 评论 0

摘要:1/*单源最短路径2*日,因为把计算节点的算式写错了,错到死3*节点太多,所以在转化成无向图的时候需要压缩一下4*因为一个节点最多与4个节点相连接,所以只需要保存4个相邻节点的信息就可以了5*6*7*8*9*/101112#include<iostream>13#include<memor
  1 /*单源最短路径
  2  *日,因为把计算节点的算式写错了,错到死
  3  *节点太多,所以在转化成无向图的时候需要压缩一下
  4  *因为一个节点最多与4个节点相连接,所以只需要保存4个相邻节点的信息就可以了
  5  *
  6  *
  7  *
  8  *
  9  */
 10 
 11 
 12 #include <iostream>
 13 #include <memory.h>
 14 #include <vector>
 15 #define inf 10000000
 16 using namespace std;
 17 int rd[10010][4];//记录某一节点相连接节点的权
 18 int np[10010][4];//记录某一节点相连接节点的号码
 19 int n[10010];//记录某一节点相连接节点的数目
 20 int vl[110][110];
 21 int vi[10010];
 22 int ans[10010];
 23 int r,l;
 24 int a,b,c,d;
 25 void set()//转化成无向图
 26 {
 27         memset(n,0,sizeof(n));
 28         for(int i=1;i<=r;i++)
 29                 for(int j=1;j<=l;j++)
 30                 {
 31                         int tem=(i-1)*l+j;
 32         //             cout<<tem<<" ";
 33                         if(i+1<=r)
 34                         {
 35                                 rd[tem][n[tem]]=vl[i+1][j];
 36                                 np[tem][n[tem]]=tem+l;
 37                                 n[tem]++;
 38                         }
 39                         if(i-1>0)
 40                         {
 41                                 rd[tem][n[tem]]=vl[i-1][j];
 42                                 np[tem][n[tem]]=tem-l;
 43                                 n[tem]++;
 44                         }
 45                         if(j+1<=l)
 46                         {
 47                                 rd[tem][n[tem]]=vl[i][j+1];
 48                                 np[tem][n[tem]]=tem+1;
 49                                 n[tem]++;
 50                         }
 51                         if(j-1>0)
 52                         {
 53                                 rd[tem][n[tem]]=vl[i][j-1];
 54                                 np[tem][n[tem]]=tem-1;
 55                                 n[tem]++;
 56                         }
 57                 }
 58 }
 59 void sl()
 60 {
 61         int root=(a-1)*l+b;
 62         for(int i=1;i<=r*l;i++)
 63                 ans[i]=inf;
 64         for(int i=0;i<n[root];i++)
 65                 ans[np[root][i]]=rd[root][i];
 66         memset(vi,0,sizeof(vi));
 67         ans[root]=0;
 68         vi[root]=1;
 69         
 70         for(int i=2;i<=r*l;i++)
 71         {
 72                 int tmp=inf;
 73                 int u=-1;
 74                 for(int j=1;j<=r*l;j++)
 75                 {
 76                         if(!vi[j]&&ans[j]<tmp)
 77                         {
 78                                 u=j;
 79                                 tmp=ans[j];
 80                         }
 81                 }
 82                 vi[u]=1;
 83                 for(int j=0;j<n[u];j++)
 84                 {
 85                         if(!vi[np[u][j]])
 86                         {
 87                                 if(ans[u]+rd[u][j]<ans[np[u][j]])
 88                                         ans[np[u][j]]=ans[u]+rd[u][j];
 89                         }
 90                 }
 91 
 92         }
 93 }
 94 int main()
 95 {
 96         int t;
 97         cin>>t;
 98         while(t--)
 99         {
100         
101 
102                 cin>>r>>l;
103                 for(int i=1;i<=r;i++)
104                         for(int j=1;j<=l;j++)
105                                 cin>>vl[i][j];
106                 set();
107 
108                 cin>>a>>b>>c>>d;
109                 sl();
110 
111                 cout<<ans[(c-1)*l+d]+vl[a][b]<<endl;
112         }
113 }

转载于:https://www.cnblogs.com/congzc/archive/2011/05/18/2329961.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/2467.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息