Hex Artifact Content
Not logged in

Artifact e714e7afac0b764b2504a44dfbe3c872e11cb9c0:


0000: 23 69 6e 63 6c 75 64 65 20 3c 76 65 63 74 6f 72  #include <vector
0010: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0020: 6e 67 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 6c  ng>.#include <al
0030: 67 6f 72 69 74 68 6d 3e 0a 23 69 6e 63 6c 75 64  gorithm>.#includ
0040: 65 20 3c 73 65 74 3e 0a 23 69 6e 63 6c 75 64 65  e <set>.#include
0050: 20 3c 69 6f 73 74 72 65 61 6d 3e 0a 75 73 69 6e   <iostream>.usin
0060: 67 20 6e 61 6d 65 73 70 61 63 65 20 73 74 64 3b  g namespace std;
0070: 0a 0a 63 6c 61 73 73 20 50 69 65 63 65 73 4d 6f  ..class PiecesMo
0080: 76 65 72 0a 7b 0a 70 75 62 6c 69 63 3a 0a 09 73  ver.{.public:..s
0090: 74 61 74 69 63 20 62 6f 6f 6c 20 69 73 5f 63 6f  tatic bool is_co
00a0: 6e 6e 65 63 74 65 64 28 69 6e 74 20 63 75 72 29  nnected(int cur)
00b0: 0a 09 7b 0a 09 09 69 6e 74 20 70 79 5b 35 5d 2c  ..{...int py[5],
00c0: 20 70 78 5b 35 5d 2c 20 70 6e 3d 30 3b 0a 09 09   px[5], pn=0;...
00d0: 66 6f 72 28 69 6e 74 20 6a 3d 30 3b 20 6a 3c 32  for(int j=0; j<2
00e0: 35 3b 20 2b 2b 6a 29 0a 09 09 09 69 66 28 20 63  5; ++j)....if( c
00f0: 75 72 20 26 20 28 31 3c 3c 6a 29 20 29 0a 09 09  ur & (1<<j) )...
0100: 09 09 70 79 5b 70 6e 5d 3d 6a 2f 35 2c 20 70 78  ..py[pn]=j/5, px
0110: 5b 70 6e 5d 3d 6a 25 35 2c 20 70 6e 2b 2b 3b 0a  [pn]=j%5, pn++;.
0120: 0a 09 09 69 6e 74 20 75 66 5b 35 5d 20 3d 20 7b  ...int uf[5] = {
0130: 30 2c 31 2c 32 2c 33 2c 34 7d 2c 20 63 6f 6e 6e  0,1,2,3,4}, conn
0140: 20 3d 20 70 6e 3b 0a 0a 09 09 66 6f 72 28 69 6e   = pn;....for(in
0150: 74 20 69 3d 30 3b 20 69 3c 70 6e 3b 20 2b 2b 69  t i=0; i<pn; ++i
0160: 29 0a 09 09 66 6f 72 28 69 6e 74 20 6a 3d 69 2b  )...for(int j=i+
0170: 31 3b 20 6a 3c 70 6e 3b 20 2b 2b 6a 29 0a 09 09  1; j<pn; ++j)...
0180: 09 69 66 28 20 70 78 5b 69 5d 3d 3d 70 78 5b 6a  .if( px[i]==px[j
0190: 5d 20 26 26 20 61 62 73 28 70 79 5b 69 5d 2d 70  ] && abs(py[i]-p
01a0: 79 5b 6a 5d 29 3d 3d 31 0a 09 09 09 20 7c 7c 20  y[j])==1.... || 
01b0: 70 79 5b 69 5d 3d 3d 70 79 5b 6a 5d 20 26 26 20  py[i]==py[j] && 
01c0: 61 62 73 28 70 78 5b 69 5d 2d 70 78 5b 6a 5d 29  abs(px[i]-px[j])
01d0: 3d 3d 31 20 29 20 7b 0a 09 09 09 09 69 6e 74 20  ==1 ) {.....int 
01e0: 61 3d 69 3b 20 77 68 69 6c 65 28 75 66 5b 61 5d  a=i; while(uf[a]
01f0: 21 3d 61 29 20 61 3d 75 66 5b 61 5d 3b 0a 09 09  !=a) a=uf[a];...
0200: 09 09 69 6e 74 20 62 3d 6a 3b 20 77 68 69 6c 65  ..int b=j; while
0210: 28 75 66 5b 62 5d 21 3d 62 29 20 62 3d 75 66 5b  (uf[b]!=b) b=uf[
0220: 62 5d 3b 0a 09 09 09 09 69 66 28 61 21 3d 62 29  b];.....if(a!=b)
0230: 20 7b 20 75 66 5b 61 5d 3d 62 2c 20 2d 2d 63 6f   { uf[a]=b, --co
0240: 6e 6e 3b 20 7d 0a 09 09 09 7d 0a 09 09 72 65 74  nn; }....}...ret
0250: 75 72 6e 20 63 6f 6e 6e 3d 3d 31 3b 0a 09 7d 0a  urn conn==1;..}.
0260: 0a 09 69 6e 74 20 67 65 74 4d 69 6e 69 6d 75 6d  ..int getMinimum
0270: 4d 6f 76 65 73 28 76 65 63 74 6f 72 20 3c 73 74  Moves(vector <st
0280: 72 69 6e 67 3e 20 62 6f 61 72 64 29 0a 09 7b 0a  ring> board)..{.
0290: 09 09 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b  ..int start = 0;
02a0: 0a 09 09 66 6f 72 28 69 6e 74 20 69 3d 30 3b 20  ...for(int i=0; 
02b0: 69 3c 32 35 3b 20 2b 2b 69 29 0a 09 09 09 69 66  i<25; ++i)....if
02c0: 28 20 62 6f 61 72 64 5b 69 2f 35 5d 5b 69 25 35  ( board[i/5][i%5
02d0: 5d 3d 3d 27 2a 27 20 29 0a 09 09 09 09 73 74 61  ]=='*' ).....sta
02e0: 72 74 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 0a 09  rt |= (1<<i);...
02f0: 09 76 65 63 74 6f 72 3c 62 6f 6f 6c 3e 20 76 69  .vector<bool> vi
0300: 73 69 74 65 64 28 31 3c 3c 32 35 29 3b 20 76 69  sited(1<<25); vi
0310: 73 69 74 65 64 5b 73 74 61 72 74 5d 20 3d 20 66  sited[start] = f
0320: 61 6c 73 65 3b 0a 09 09 76 65 63 74 6f 72 3c 69  alse;...vector<i
0330: 6e 74 3e 20 51 28 31 2c 20 73 74 61 72 74 29 3b  nt> Q(1, start);
0340: 0a 09 09 69 6e 74 20 73 74 65 70 20 3d 20 30 3b  ...int step = 0;
0350: 0a 09 09 66 6f 72 28 3b 3b 20 2b 2b 73 74 65 70  ...for(;; ++step
0360: 29 0a 09 09 7b 0a 09 09 09 76 65 63 74 6f 72 3c  )...{....vector<
0370: 69 6e 74 3e 20 51 32 3b 0a 09 09 09 66 6f 72 28  int> Q2;....for(
0380: 69 6e 74 20 69 3d 30 3b 20 69 21 3d 51 2e 73 69  int i=0; i!=Q.si
0390: 7a 65 28 29 3b 20 2b 2b 69 29 0a 09 09 09 7b 0a  ze(); ++i)....{.
03a0: 09 09 09 09 69 6e 74 20 63 75 72 20 3d 20 51 5b  ....int cur = Q[
03b0: 69 5d 3b 0a 09 09 09 09 69 66 28 20 69 73 5f 63  i];.....if( is_c
03c0: 6f 6e 6e 65 63 74 65 64 28 63 75 72 29 20 29 0a  onnected(cur) ).
03d0: 09 09 09 09 09 72 65 74 75 72 6e 20 73 74 65 70  .....return step
03e0: 3b 0a 0a 09 09 09 09 2f 2f 20 6e 65 78 74 0a 09  ;......// next..
03f0: 09 09 09 69 6e 74 20 64 78 5b 5d 20 3d 20 7b 31  ...int dx[] = {1
0400: 2c 2d 31 2c 30 2c 30 7d 3b 0a 09 09 09 09 69 6e  ,-1,0,0};.....in
0410: 74 20 64 79 5b 5d 20 3d 20 7b 30 2c 30 2c 31 2c  t dy[] = {0,0,1,
0420: 2d 31 7d 3b 0a 09 09 09 09 66 6f 72 28 69 6e 74  -1};.....for(int
0430: 20 6a 3d 30 3b 20 6a 3c 32 35 3b 20 2b 2b 6a 29   j=0; j<25; ++j)
0440: 0a 09 09 09 09 09 69 66 28 20 63 75 72 20 26 20  ......if( cur & 
0450: 28 31 3c 3c 6a 29 20 29 0a 09 09 09 09 09 09 66  (1<<j) ).......f
0460: 6f 72 28 69 6e 74 20 6b 3d 30 3b 20 6b 3c 34 3b  or(int k=0; k<4;
0470: 20 2b 2b 6b 29 0a 09 09 09 09 09 09 7b 0a 09 09   ++k).......{...
0480: 09 09 09 09 09 69 6e 74 20 6a 79 3d 6a 2f 35 2b  .....int jy=j/5+
0490: 64 79 5b 6b 5d 2c 20 6a 78 3d 6a 25 35 2b 64 78  dy[k], jx=j%5+dx
04a0: 5b 6b 5d 3b 0a 09 09 09 09 09 09 09 69 66 28 30  [k];........if(0
04b0: 3c 3d 6a 79 20 26 26 20 6a 79 3c 35 20 26 26 20  <=jy && jy<5 && 
04c0: 30 3c 3d 6a 78 20 26 26 20 6a 78 3c 35 29 20 7b  0<=jx && jx<5) {
04d0: 0a 09 09 09 09 09 09 09 09 69 6e 74 20 6e 65 78  .........int nex
04e0: 74 20 3d 20 31 20 3c 3c 20 28 6a 79 2a 35 2b 6a  t = 1 << (jy*5+j
04f0: 78 29 3b 0a 09 09 09 09 09 09 09 09 69 66 28 20  x);.........if( 
0500: 21 28 63 75 72 26 6e 65 78 74 29 20 29 20 7b 0a  !(cur&next) ) {.
0510: 09 09 09 09 09 09 09 09 09 6e 65 78 74 20 3d 20  .........next = 
0520: 63 75 72 26 7e 28 31 3c 3c 6a 29 7c 6e 65 78 74  cur&~(1<<j)|next
0530: 3b 0a 09 09 09 09 09 09 09 09 09 69 66 28 20 21  ;..........if( !
0540: 76 69 73 69 74 65 64 5b 6e 65 78 74 5d 20 29 20  visited[next] ) 
0550: 7b 0a 09 09 09 09 09 09 09 09 09 09 76 69 73 69  {...........visi
0560: 74 65 64 5b 6e 65 78 74 5d 3d 74 72 75 65 3b 0a  ted[next]=true;.
0570: 09 09 09 09 09 09 09 09 09 09 51 32 2e 70 75 73  ..........Q2.pus
0580: 68 5f 62 61 63 6b 28 6e 65 78 74 29 3b 0a 09 09  h_back(next);...
0590: 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 09  .......}........
05a0: 09 7d 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09  .}........}.....
05b0: 09 09 7d 0a 09 09 09 7d 0a 09 09 09 51 2e 73 77  ..}....}....Q.sw
05c0: 61 70 28 51 32 29 3b 0a 09 09 7d 0a 09 09 72 65  ap(Q2);...}...re
05d0: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 7d 3b 0a 0a  turn -1;..}.};..
05e0: 69 6e 74 20 6d 61 69 6e 28 29 0a 7b 0a 09 76 65  int main().{..ve
05f0: 63 74 6f 72 3c 73 74 72 69 6e 67 3e 20 78 3b 0a  ctor<string> x;.
0600: 78 2e 70 75 73 68 5f 62 61 63 6b 28 22 2e 2e 2e  x.push_back("...
0610: 2e 2e 22 29 3b 0a 78 2e 70 75 73 68 5f 62 61 63  ..");.x.push_bac
0620: 6b 28 22 2e 2e 2a 2a 2e 22 29 3b 0a 78 2e 70 75  k("..**.");.x.pu
0630: 73 68 5f 62 61 63 6b 28 22 2e 2e 2e 2e 2e 22 29  sh_back(".....")
0640: 3b 0a 78 2e 70 75 73 68 5f 62 61 63 6b 28 22 2e  ;.x.push_back(".
0650: 2e 2e 2a 2e 22 29 3b 0a 78 2e 70 75 73 68 5f 62  ..*.");.x.push_b
0660: 61 63 6b 28 22 2e 2e 2e 2e 2e 22 29 3b 0a 09 63  ack(".....");..c
0670: 6f 75 74 20 3c 3c 20 50 69 65 63 65 73 4d 6f 76  out << PiecesMov
0680: 65 72 28 29 2e 67 65 74 4d 69 6e 69 6d 75 6d 4d  er().getMinimumM
0690: 6f 76 65 73 28 78 29 20 3c 3c 20 65 6e 64 6c 3b  oves(x) << endl;
06a0: 3b 0a 7d 0a                                      ;.}.