poj 2907 Collecting Beepers (dfs)

http://poj.org/problem?id=2907

挺简单的一题,但是上来就给想错了。应该是按各个可用点搜索,累加各点间距离取最小,我想的是按坐标全搜,标记过程值。

code:

#include<cstdio>
#include<cstring>
using namespace std ;
const int MAX = 1e8 ;
int n, m, sx, sy, num, ans ;
struct node{
    int x, y ;
    bool vis ;
}bee[11] ;
int dis(int p, int q){
    int dx = bee[p].x-bee[q].x<0?bee[q].x-bee[p].x:bee[p].x-bee[q].x ;
    int dy = bee[p].y-bee[q].y<0?bee[q].y-bee[p].y:bee[p].y-bee[q].y ;
    return dx + dy ;
}
void dfs(int sum, int p, int len){
    if(len>=ans)    return ;
    if(sum==num){
        int d = len+dis(p, 0) ;
        if(d<ans)  ans = d ;
        return ;
    }
    for(int i=1; i<=num; i++){
        if(!bee[i].vis){
            bee[i].vis = true ;
            dfs(sum+1, i, len+dis(p, i)) ;
            bee[i].vis = false ;
        }
    }
}
int main(){
    int t, x, y ;
    scanf("%d", &t) ;
    while(t--){
        scanf("%d%d", &n, &m) ;
        scanf("%d%d", &bee[0].x, &bee[0].y) ;
        scanf("%d", &num) ;
        for(int i=1; i<=num; i++){
            scanf("%d%d", &bee[i].x, &bee[i].y) ;
            bee[i].vis = false ;
        }
        ans = MAX ;
        dfs(000) ;
        printf("The shortest path has length %d\n", ans) ;
    }
    return 0 ;
}

原文地址:https://www.cnblogs.com/xiaolongchase/p/2376095.html