對於騎士帶王去會合的情況,列舉王的原位置和八個方向,也就是說王和騎士的匯合點相對於王的原位置為上下左右或者斜45度方向。
比如在8*8的棋盤上,王的位置用k表示,需要列舉的帶王的點用1表示,其餘點用0表示則有下圖:
0 0 1 0 0 1 0 0對於其他帶王點的情況,總可以等效為以上情況之一,這樣列舉不會超時。1 0 1 0 1 0 0 0
0 1 1 1 0 0 0 0
1 1 k 1 1 1 1 1
0 1 1 1 0 0 0 0
1 0 1 0 1 0 0 0
0 0 1 0 0 1 0 0
0 0 1 0 0 0 1 0
需要注意的是,輸入時的r,c分別代表列數和行數。
主要用bfs,搜出對於每乙個knight到達每乙個格仔所需的步數。(除錯了乙個下午,結果是字母打錯了,好想罵人啊)
具體思路看**吧。
#include
#include
#include
#include
#include
using namespace std;
struct aaaa;
int moveking[8][2]=,,,,,,,};
int moveknight[8][2]=,,,,,,,};
int king[2],knight[1041][2],kingdist[27][41];
int disttoking[200][27][41];
int dist[1041][27][41],zonghe[27][41],r,c,numknight=1,num=0;
void bfs(int s[2],int move[8][2],int dist1[27][41]);
int main()
numknight--;
bfs(king,moveking,kingdist);
for(int i=0;i<8;i++)
}bfs(king,moveknight,disttoking[num]);
for(int i=1;i<=numknight;i++)
int min1=99999999,lala;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
for(int k=1;k<=numknight;k++)
zonghe[i][j]+=dist[k][i][j];
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
dist1[s[0]][s[1]]=0;
q.push((aaaa));
done[s[0]][s[1]]=true;
while(!q.empty())}}
} 可能這個更清楚:
#include#include
#define lenque 781
#define infi 500
file
*fin,*fout;
int r,c;
int dist[
781][31
][27]
;int total[31]
[27];
int distking[31]
[27];
int distride[
120][31
][27]
;int numride;
int king[2]
;int numknight;
int knight[
781][2
];int moveknight[8]
[2]=
,,,,,,,};
int moveking[8]
[2]=
,,,,,,,};
int queue[lenque][3
];bool done[31]
[27];
void bfs(
int s[
2],int move[8]
[2],int distmemo[31]
[27])
}}head=
(head+1)
%lenque;}}
int main(
)int i;
bfs(king,moveking,distking)
;for
(i=0
;i<
8;i++)}
bfs(king,moveknight,distride[numride++])
;for
(i=0
;i)int min=
0x7fffffff
;int gr,gc,ride,d,move;
for(gr=
0;gr)for
(gc=
0;gcfor(gr=
0;gr)for
(gc=
0;gc}}
fprintf
(fout,"%d\n",min)
;return0;
}
JZOJ 4622 亞瑟王之宮
先用sp b fa把兩兩點的最短路程是多少,這樣我們就可以列舉兩個點a,b,再以每個點到a和b的差從大到小排個序,再貪心選,複雜度 o r2c2 nlog2 n include include include include include define fo i,a,b for int i a i...
JZOJ4622 亞瑟王之宮
這題時限開的挺大的。由於時限較大,我們可以預處理出每個座標走日字步到另一座標的最短距離,o r3c3 的floyd可以解決 可以考慮用spfa,但這裡的點入隊時間較長 然後我們列舉兩個匯合點,我們貪心的想,乙個騎士走到第乙個座標距離如果比走到第二個的小的多,那麼我們肯定不走到第二個座標,反之就不走到...
APIO2016 亞瑟王之宮
暴力 一開始看到這題 暴搜?剪枝?貪心?不知所措,但是想了一想,肯定是要預處理出每個騎士到每個點的最短路的。然後打完第三題有來做這題,發現r和c很小,那麼可以暴力出兩個點對,然後分配騎士到兩個點對去,使得答案最小。dp是肯定可以做的。貪心 現在搜到了點對i和j,假設所有的騎士都去i,每個騎士的貢獻是...