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 ;
}

你可能感兴趣的:(poj)