题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26766

思路:由于数据不是很大,我们可以枚举骑士最后聚集的位置,然后枚举的时候用bfs搜索即可。

loj 1046(bfs)_搜索loj 1046(bfs)_搜索_02
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<vector>
 7 using namespace std;
 8 #define MAXN 14
 9 
10 struct Node{
11     int x,y,step;
12     Node(){}
13     Node(int _x,int _y,int _step):x(_x),y(_y),step(_step){}
14 };
15 int n,m,min_step;
16 char map[MAXN][MAXN];
17 bool mark[MAXN][MAXN];
18 int dir[8][2]={{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};
19 vector<pair<int,pair<int,int> > >g;
20 
21 int bfs(Node &st,Node &ed)
22 {
23     memset(mark,false,sizeof(mark));
24     queue<Node>que;
25     que.push(st);
26     mark[st.x][st.y]=true;
27     while(!que.empty()){
28         Node q,p=que.front();
29         que.pop();
30         if(p.x==ed.x&&p.y==ed.y){
31             return p.step;
32         }
33         for(int i=0;i<8;i++){
34             q.x=p.x+dir[i][0];
35             q.y=p.y+dir[i][1];
36             if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m&&!mark[q.x][q.y]){
37                 mark[q.x][q.y]=true;
38                 q.step=p.step+1;
39                 que.push(q);
40             }
41         }
42     }
43     return -1;
44 }
45 
46 void Solve()
47 {
48     min_step=1000000;
49     for(int i=0;i<n;i++){
50         for(int j=0;j<m;j++){
51             bool flag=true;
52             int step=0;
53             for(int k=0;k<g.size();k++){
54                 Node st,ed;
55                 int kk=g[k].first;//骑士的种类
56                 st.x=g[k].second.first,st.y=g[k].second.second,st.step=0;
57                 ed.x=i,ed.y=j;
58                 int dd=bfs(st,ed);
59                 if(dd==-1){ flag=false;break; }
60                 step+=(dd+kk-1)/kk;
61             }
62             if(flag)min_step=min(min_step,step);
63         }
64     }
65     if(min_step==1000000){
66         puts("-1");
67     }else 
68         printf("%d\n",min_step);
69 }
70 
71 
72 int main()
73 {
74     int _case,t=1;
75     scanf("%d",&_case);
76     while(_case--){
77         scanf("%d%d",&n,&m);
78         g.clear();
79         for(int i=0;i<n;i++){
80             scanf("%s",map[i]);
81             for(int j=0;j<m;j++){
82                 if(map[i][j]>='1'&&map[i][j]<='9')g.push_back((make_pair(map[i][j]-'0',make_pair(i,j))));
83             }
84         }
85         printf("Case %d: ",t++);
86         Solve();
87     }
88     return 0;
89 }
View Code