恶心的题啊 。。
先枚举哪个点是所有人集合的点 再枚举所有骑士遇见国王的点 如果全部枚举出来会大大的TLE 经大牛验证 只需要枚举国王周围的点就可以了+-2 之内
然后各种繁琐 各种错误 骑士有可能不带着国王一块走 也可能在他周围选个点带着走 先预处理出来每个骑士到国王周围的最短距离 然后再按上面的枚举就可以了
考虑的不全面 。。错了好多个样例 样例2,6,19,20 都模拟了一遍。。还好错在小数据上 可以手算模拟一下 就知道哪错了 变量名都被我用穷了。。
1 /*
2 ID: shangca2
3 LANG: C++
4 TASK: camelot
5 */
6 #include <iostream>
7 #include<cstdio>
8 #include<cstring>
9 #include<algorithm>
10 #include<stdlib.h>
11 #include<cmath>
12 #include<queue>
13 #define INF 0x3f3f3f
14 using namespace std;
15 int vis[35][35],dis[8][2] = {{2,1},{2,-1},{1,2},{1,-2},{-1,-2},{-1,2},{-2,1},{-2,-1}};
16 typedef struct node
17 {
18 int x,y,num;
19 }st;
20 st qq[10010];
21 int o[35][30][35][30],x[910],y[910],n,m,ans,xx,yy,f[35][35],g;
22 int ff[35][35],di,s;
23 int judge(int x,int y)
24 {
25 if(x<=0||y<=0||x>n||y>m)
26 return 0;
27 return 1;
28 }
29 int bfs(int xi,int yi,int e1,int e2,int flag)
30 {
31 queue<st>q;
32 s=0;int ss=0;
33 memset(vis,0,sizeof(vis));
34 memset(ff,0,sizeof(ff));
35 int i;
36 st tt,te;
37 tt.x = xi;
38 tt.y = yi;
39 tt.num = 0;
40 vis[xi][yi] = 1;
41 q.push(tt);
42 int fff = 0;
43 while(!q.empty())
44 {
45 tt = q.front();
46 q.pop();
47 if(flag&&tt.x==e1&&tt.y==e2)
48 {
49 fff = 1;
50 return tt.num;
51 }
52 o[xi][yi][tt.x][tt.y] = tt.num;
53 o[tt.x][tt.y][xi][yi] = tt.num;
54 if(f[tt.x][tt.y])
55 ss+=tt.num;
56 if(ss>ans)
57 return -1;
58 for(i = 0 ;i < 8 ; i++)
59 {
60 int tx = tt.x+dis[i][0];
61 int ty = tt.y+dis[i][1];
62 if(judge(tx,ty)&&!vis[tx][ty])
63 {
64 te.x = tx;
65 te.y = ty;
66 te.num = tt.num+1;
67 vis[tx][ty] = 1;
68 q.push(te);
69 }
70 }
71 }
72 if(flag&&!fff)
73 return INF;
74 for(i = 1; i <= g ;i++)
75 s+=o[xi][yi][x[i]][y[i]];
76 return s;
77 }
78 int main()
79 {
80 freopen("camelot.in","r",stdin);
81 freopen("camelot.out","w",stdout);
82 int i,j,k,e,ee;
83 for(i =0 ;i <= 33 ; i++)
84 for(j =0 ;j <= 33 ; j++)
85 for(e =0 ;e <= 33 ; e++)
86 for(ee =0 ;ee <= 33 ; ee++)
87 o[i][j][e][ee] = INF;
88 char c;
89 ans = INF;
90 cin>>n>>m;
91 cin>>c>>xx;
92 yy = c-'A'+1;
93 while(cin>>c>>k)
94 {
95 int yg = c-'A'+1;
96 int xg = k;
97 g++;
98 x[g] = xg;
99 y[g] = yg;
100 f[xg][yg] = 1;
101 }
102 int dd[25][2] = {0,0,0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1,2,0,2,1,2,2,2,-1,2,-2,
103 -2,0,-2,1,-2,2,-2,-1,-2,-2,0,2,1,2,-1,2,0,-2,1,-2,-1,-2};
104 for(e = 1; e <= g ;e++)
105 {
106 for(ee = 0 ; ee < 25 ; ee++)
107 {
108 int tx = xx+dd[ee][0];
109 int ty = yy+dd[ee][1];
110 if(judge(tx,ty))
111 {
112 int oo = bfs(x[e],y[e],tx,ty,1);
113 if(oo!=INF)
114 {
115 o[tx][ty][x[e]][y[e]] = oo;
116 o[x[e]][y[e]][tx][ty] = oo;
117 }
118 }
119 }
120 }
121 int dis = INF;
122 for(i = 1; i <= n ; i++)
123 for(j = 1; j <= m ; j++)
124 {
125 if(bfs(i,j,0,0,0)<0)
126 continue;
127 int ko = bfs(i,j,0,0,0);
128 int tns = ko+max(abs(i-xx),abs(j-yy));
129 if(tns<ans)
130 ans = tns;
131
132 if(g==0)
133 ans = ko;
134 for(e = 1; e <= g ;e++)
135 {
136 for(ee = 0 ; ee < 25 ; ee++)
137 {
138 int tx = xx+dd[ee][0];
139 int ty = yy+dd[ee][1];
140 int o1 = o[x[e]][y[e]][tx][ty],o2 = o[i][j][tx][ty],o3 = o[i][j][x[e]][y[e]];
141 if(o1==INF||o2==INF||o3==INF)
142 continue;
143 if(judge(tx,ty)&&ans>(o1+o2-o3+ko+max(abs(tx-xx),abs(ty-yy))))
144 {
145 ans = o1+o2-o3+ko+max(abs(tx-xx),abs(ty-yy));
146 }
147 }
148 }
149 }
150 cout<<ans<<endl;
151 return 0;
152 }
View Code