zoukankan      html  css  js  c++  java
  • 13杭州现场赛Stealing Harry Potter's Precious(bfs+dfs)

    题意:一个简单图,给你一个起点,图中最多有4个宝藏,问你收集这四个宝藏最多要多少步.

    解题思路:很简单的一个题,因为宝藏比较少,所以先对宝藏进行一个全排,然后再一步一步算步数.

    解题代码:

      1 // File Name: d.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年05月06日 星期二 19时03分57秒
      4 
      5 #include<vector>
      6 #include<set>
      7 #include<deque>
      8 #include<stack>
      9 #include<bitset>
     10 #include<algorithm>
     11 #include<functional>
     12 #include<numeric>
     13 #include<utility>
     14 #include<sstream>
     15 #include<iostream>
     16 #include<iomanip>
     17 #include<cstdio>
     18 #include<cmath>
     19 #include<cstdlib>
     20 #include<cstring>
     21 #include<ctime>
     22 
     23 using namespace std;
     24 int n , m;
     25 struct node{
     26   int x, y ,s;
     27 }LIST[10005];
     28 int visit[104][104];
     29 int MAP[104][104];
     30 struct node1{
     31   int x, y ; 
     32 }a[10];
     33 int xadd[] = {0,0,1,-1};
     34 int yadd[] = {1,-1,0,0};
     35 int ok = 1;
     36 int bfs(int bx, int by ,int ex,int ey)
     37 {
     38     //printf("%d %d %d %d
    ",bx,by,ex,ey);
     39     LIST[1].x = bx ; 
     40     LIST[1].y = by ; 
     41     LIST[1].s = 0 ; 
     42     int l = 1, r= 1; 
     43     int tempok = 0 ;
     44     memset(visit,0,sizeof(visit));
     45     visit[bx][by] = 1; 
     46     while(l <= r )
     47     {
     48       //  printf("%d %d
    ",LIST[l].x,LIST[l].y);
     49         if(LIST[l].x == ex && LIST[l].y == ey)
     50         {
     51           tempok = 1; 
     52           break;
     53         }
     54         for(int i = 0 ; i <= 3;i ++)
     55         {
     56           int tempx = LIST[l].x + xadd[i];
     57           int tempy = LIST[l].y + yadd[i];
     58           if(!visit[tempx][tempy] && MAP[tempx][tempy])
     59           {
     60              visit[tempx][tempy] = 1;
     61              r ++ ;
     62              LIST[r].x = tempx; 
     63              LIST[r].y = tempy; 
     64              LIST[r].s = LIST[l].s +1 ; 
     65           }
     66         }
     67        l ++;
     68     }
     69     if(tempok == 0)
     70         ok = 0;
     71     else return LIST[l].s;
     72 
     73 }
     74 int main(){
     75 
     76 
     77       while(scanf("%d %d",&n,&m) != EOF)
     78       {
     79         if(n == 0  && m == 0)
     80             break;
     81         memset(MAP,0,sizeof(MAP));
     82         memset(a,0,sizeof(a));
     83         for(int i = 1;i <= n;i ++)
     84         {
     85           char str[104];
     86           scanf("%s",&str[1]);
     87           for(int j = 1;j <= m;j ++)
     88           {
     89              if(str[j] == '#')
     90              {
     91              }
     92              else 
     93              {
     94                  MAP[i][j] = 1;
     95                  if(str[j] == '@')
     96                  {
     97                  a[0].x = i ; 
     98                  a[0].y = j; 
     99                  }
    100              }
    101           }
    102         }
    103         int  k ; 
    104         scanf("%d",&k);
    105         for(int i = 1;i <= k;i ++)
    106             scanf("%d %d",&a[i].x,&a[i].y);
    107         int temp[6];
    108         for(int i =0 ;i < k;i ++)
    109           temp[i] = i + 1; 
    110         ok = 1; 
    111         int min = 1000000;
    112         do{
    113            int last = 0;
    114            int sum = 0 ; 
    115            for(int i = 0 ;i < k ;i ++)
    116            {
    117              sum +=  bfs(a[last].x,a[last].y,a[temp[i]].x,a[temp[i]].y); 
    118              last = temp[i];
    119            }
    120            if (sum <= min)
    121                min = sum;
    122         
    123           //  printf("%d
    ",sum);
    124         }while(next_permutation(temp,temp+k));    
    125         if(ok == 0 )
    126             printf("-1
    ");
    127         else 
    128         printf("%d
    ",min);
    129       }
    130       
    131 return 0 ;
    132 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    iOS中的事件传递和响应者链条
    iOS多线程--NSOperation
    Objective-C—— @Property详解
    iOS网络——NSURLCache设置网络请求缓存
    Objective-C—— Block
    iOS多线程——GCD篇
    Objective-C设计模式——中介者Mediator(对象去耦)
    Objective-C设计模式——外观Faced(接口适配)
    Objective-C设计模式——桥接Bridge(接口适配)
    Objective-C设计模式——适配器Adapter(接口适配)
  • 原文地址:https://www.cnblogs.com/zyue/p/3714178.html
Copyright © 2011-2022 走看看