一道很典型的最短路径的题目。
算法的思想来自于Dijkstra(迪杰斯特拉)算法,大家在这里对这个算法就不介绍了。
可以在学完最短经的算法后,用这道题目当做练手。。我的算法还需要优化一下,代码也需要优化,因为我的代码确实有点乱。。下面的代码仅供参考。。
题目的链接:http://soj.me/1703
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
using namespace std;
int dis[130][130];
struct Gra
{
int r;
int c;
friend bool operator <(Gra g1, Gra g2)
{
if(dis[g1.r][g1.c] < dis[g2.r][g2.c])
return true;
}
};
int main()
{
int t;
int count = 1;
while (cin >> t && t != 0)
{
int s[130][130];
for (int i = 1; i <= t; ++ i)
{
for (int j = 1; j <= t; ++ j)
{
cin >> s[i][j];
}
}
set<Gra> q;
int know[130][130];
memset(know, 0, sizeof(know));
memset(dis, 9999999, sizeof(dis));
Gra tu[16900];
tu[1].r = 1;
tu[1].c = 1;
q.insert(tu[1]);
Gra temp;
int i = 2;
dis[1][1] = s[1][1];
set<Gra>::iterator it;
set<Gra>::iterator itt;
while (!q.empty())
{
it = q.begin();
temp = *it;
itt = it;
++ it;
Gra tem;
for (; it != q.end(); ++ it)
{
tem = *it;
if (dis[temp.r][temp.c] > dis[tem.r][tem.c])
{
temp = tem;
itt = it;
}
}
q.erase(itt);
know[temp.r][temp.c] = 1;
if (temp.r == t && temp.c == t)
{
cout << "Problem " << count << ": " << dis[temp.r][temp.c] << endl;
break;
}
if (temp.c - 1 >= 1)
{
tu[i].c = temp.c - 1;
tu[i].r = temp.r;
if (know[tu[i].r][tu[i].c] == 0)
{
if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c])
{
dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c];
q.insert(tu[i]);
++ i;
}
}
}
if (temp.r - 1 >= 1)
{
tu[i].r = temp.r - 1;
tu[i].c = temp.c;
if (know[tu[i].r][tu[i].c] == 0)
{
if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c])
{
dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c];
q.insert(tu[i]);
++ i;
}
}
}
if (temp.c + 1 <= t)
{
tu[i].c = temp.c + 1;
tu[i].r = temp.r;
if (know[tu[i].r][tu[i].c] == 0)
{
if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c])
{
dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c];
q.insert(tu[i]);
++ i;
}
}
}
if (temp.r + 1 <= t)
{
tu[i].r = temp.r + 1;
tu[i].c = temp.c;
if (know[tu[i].r][tu[i].c] == 0)
{
if (dis[tu[i].r][tu[i].c] > dis[temp.r][temp.c] + s[tu[i].r][tu[i].c])
{
dis[tu[i].r][tu[i].c] = dis[temp.r][temp.c] + s[tu[i].r][tu[i].c];
q.insert(tu[i]);
++ i;
}
}
}
}
++ count;
}
//system("pause");
}