题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1119
题目描述:一个网格状分布的路网,每个格子边长100米;有些格子可以斜跨,求最短路径的长度;典型的DFS;
上AC代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
const double DIS = 999999;
vector<double>dis;
vector<bool>rela;
int N, M;
double getDis(int i, int j){
if (i == N&&j == M)
return 0;
if (i <= N&&j <= M){
int index = i*(M + 1) + j;
if (dis[index] == DIS){
double a = getDis(i + 1, j);
double b = getDis(i, j + 1);
a = a>b ? b : a;
a += 100;
if (rela[index]){
b = 100 * sqrt(2);
b += getDis(i + 1, j + 1);
a = a < b ? a : b;
}
dis[index] = a;
}
return dis[index];
}
else
return DIS;
}
void func(){
cin >> N >> M;
size_t i, j, len, k;
dis.resize((N + 1)*(M + 1), DIS);
rela.resize((N + 1)*(M + 1), false);
cin >> len;
while (len--){
cin >> i >> j;
k = (i - 1)*(M + 1) + j - 1;
rela[k] = true;
}
cout << round(getDis(0, 0)) << endl;
}
int main(){
freopen("out.txt", "w", stdout);
freopen("in.txt", "r", stdin);
func();
}