usaco3 3 4亞瑟王的宮殿

2021-06-23 01:30:25 字數 2567 閱讀 3011

對於騎士帶王去會合的情況,列舉王的原位置和八個方向,也就是說王和騎士的匯合點相對於王的原位置為上下左右或者斜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,每個騎士的貢獻是...