最开始想用动态规划,但是水平太低,写出来居然超时了。
接下用dijkstra算法,dijkstra算主要分为初始化,找最小,修改,跳出。
这里我不知道为什么用if(tmp==INF) return ans[er][ec]会出错,明明在调试的时候查看的值都是正确的,但是在dos命令行中返回的值确实错误的。
debug很久发现是if后面多打了个分号,,,,
主要这中其实是row*column个顶点的图,每个顶点到它相邻的几个点。
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 110;
const int INF = 0x3f3f3f3f;
int matrix[maxn][maxn];
int ans[maxn][maxn];
int vis[maxn][maxn];
int row,column;
int sr,sc,er,ec;
int dr[] = {1,0,-1,0};
int dc[] = {0,1,0,-1};
bool isin(int r,int c) {
return r>0&&r<=row&&c>0&&c<=column;
}
int f(int r,int c) {
int tr,tc;
int nr,nc;
for (int h=0;h<row*column;h++) {
int tmp = INF;
for (int j=1;j<=row;j++)for (int k=1;k<=column;k++) if (tmp>ans[j][k]&&!vis[j][k]) { tmp = ans[j][k]; nr = j; nc = k; }
vis[nr][nc] = 1;
if(nr==er&&nc==ec) return tmp;
for (int i=0;i<4;i++) { tr = nr +dr[i]; tc = nc +dc[i];
if(isin(tr,tc)&&!vis[tr][tc]&&ans[tr][tc]>ans[nr][nc]+matrix[tr][tc])
ans[tr][tc]=ans[nr][nc]+matrix[tr][tc];
}
}
}
int main() {
int t;
cin>>t;
while (t--) {
cin>>row>>column;
for (int i=1;i<=row;i++)
for (int j=1;j<=column;j++)
cin>>matrix[i][j];
cin>>sr>>sc>>er>>ec;
memset(ans,0x3f,sizeof(ans));
memset(vis,0,sizeof(vis));
ans[sr][sc]=matrix[sr][sc];
cout<<f(sr,sc)<<endl;
}
}
707

被折叠的 条评论
为什么被折叠?



