题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3567
参考代码:https://www.xuebuyuan.com/3266380.html
学习双向广搜好难啊~~时间似乎也不够快
本题最难的点在于如何按字典序来输出
根据上面参考的博客发现最重要的点有:
1.当反向bfs找到时直接跳过这一步,因为不能把正向bfs的结果覆盖掉;
2.反向找的时候出现了重复要判断该次重复是否能构成更小的字典序;
3.要设置层数L,必须是两个都得一层一层来,不然会WA。
字典序之外还有:当输入的数据两行相同时,要输出走了0步,并且输出一行空行。
此外我还犯了个小错误把factory数组中的40320打成了40230导致有少部分数据的输出结果错误。
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
using namespace std;
const int factory[] = { 1,1,2,6,24,120,720,5040,40320,362880 };
const int dr[] = { 1,0, 0, -1 };//dlru
const int dc[] = { 0 ,-1 ,1,0 };
const char* str = "dlru";
const int maxn = 362880 + 5;
int s[9], e[9];
char tag[maxn];
string lu[maxn];
int cantor(const int(&a)[9]) {
int ret = 0;
for (int i = 0; i < 9; i++) {
int rank = 0;
for (int j = i + 1; j < 9; j++)
if (a[i] > a[j])rank++;
ret += rank * factory[8 - i];
}
return ret + 1;
}
inline void read(int& x) {
char ch = getchar();
while (ch == ' ' || ch == '\n')ch = getchar();
if (ch == 'X')ch = '0';
x = ch - '0';
}
bool check(int x, int y) {
if (x < 0 || x >= 3 || y < 0 || y >= 3)return false;
return true;
}
void make_tag(int kt, char tip) {
tag[kt] = tip;
}
char get_tag(int kt) {
return tag[kt];
}
struct node {
int state[9], kt, deep;
};
void DBFS() {
memset(tag, 0, sizeof(tag));
node u, v;
memcpy(u.state, s, sizeof(s));
memcpy(v.state, e, sizeof(e));
u.kt = cantor(u.state);
v.kt = cantor(v.state);
u.deep = v.deep = 0;
if (u.kt == v.kt) {
printf("0\n\n");
return;
}
lu[u.kt] = "";
lu[v.kt] = "";
make_tag(u.kt, '1');
make_tag(v.kt, '2');
queue<node>q, t;
q.push(u);
t.push(v);
int L = 0;
while (!q.empty() || !t.empty()) {
int pos, pos2, px, py;
while (q.front().deep == L) {
u = q.front(); q.pop();
for (pos = 0; u.state[pos]; pos++);
px = pos / 3; py = pos % 3;
for (int i = 0; i < 4; i++) {
int row = px + dr[i];
int col = py + dc[i];
if (!check(row, col))continue;
pos2 = row * 3 + col;
v = u;
swap(v.state[pos], v.state[pos2]);
v.kt = cantor(v.state);
v.deep = u.deep + 1;
if (get_tag(v.kt) == '2') {
printf("%d\n%s\n", lu[u.kt].size() + lu[v.kt].size() + 1, (lu[u.kt] + str[i] + lu[v.kt]).c_str());
return;
}
else if (get_tag(v.kt) == '1')continue;
lu[v.kt] = lu[u.kt] + str[i];//父节点
make_tag(v.kt, '1');
q.push(v);
}
}
while (t.front().deep == L) {
u = t.front(); t.pop();
for (pos = 0; u.state[pos]; pos++);
px = pos / 3; py = pos % 3;
for (int i = 0; i < 4; i++) {
int row = px + dr[i];
int col = py + dc[i];
if (!check(row, col))continue;
pos2 = row * 3 + col;
v = u;
swap(v.state[pos], v.state[pos2]);
v.deep = u.deep + 1;
v.kt = cantor(v.state);
if (get_tag(v.kt) == '1')continue;
if (get_tag(v.kt) == '2' && lu[v.kt][0] < str[3 - i]) continue;
lu[v.kt] = str[3 - i] + lu[u.kt];//父节点
make_tag(v.kt, '2');
t.push(v);
}
}
L++;
}
}
int main(void) {
int T; scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
for (int i = 0; i < 9; i++)read(s[i]);
for (int i = 0; i < 9; i++)read(e[i]);
printf("Case %d: ", kase);
DBFS();
}
return 0;
}
需要更多的数据可以去hdu的discuss里或者点击上述博客网址找数据生成器😜
给出一组测试数据:
203
12X453786
12345678X
564178X23
7568X4123
12345678X
12345678X
783X64215
73862X541
7546318X2
X61357842
3465827X1
5316428X7
5724368X1
37X645281
63X574281
78345X621
362X84175
285X74316
7234586X1
2138X7654
635X24178
751X38462
327X86145
X21653478
7X8132456
632X74185
X65721843
834765X21
X38716254
1X5782463
X63127548
5236X8174
8625X7431
785X13642
741X53682
65412X378
2746183X5
X58234671
43X516278
27685143X
146832X57
254687X31
513674X28
231486X57
87156423X
6134X5728
8132456X7
35482167X
637X84251
8716X2453
5X3728461
57X681432
X18562347
X72154368
85X327146
2435618X7
7263X1845
48573126X
6528X7134
1X7284536
487X25613
X75361824
8X6721534
7X3816524
857X64312
4132X8675
853126X74
86735X214
X21654387
1274386X5
X68154273
7235186X4
8731256X4
4X1735826
58X126473
241567X38
8641753X2
31426X587
8764X2531
351487X26
6X3872514
16583X427
641X28753
87125643X
314786X25
6721583X4
862X73451
1358426X7
61532X874
X32764185
1857X3246
1523X8746
5318427X6
1256347X8
X74215683
46375218X
84617X532
6871X3542
8543172X6
83512674X
8X7513624
6X4123785
871X65324
X57126834
X74253168
813X62574
26345X781
853617X24
5361874X2
6X5217843
4285X6371
43X265178
167382X54
57826314X
4762138X5
6534X7821
45X768123
186X52374
56X378412
264X87351
6274X5318
185763X24
3142785X6
846X13725
3X7215846
8637142X5
8263154X7
568423X17
671X25438
45X681372
3871562X4
542137X68
178X46253
47X358162
2X4137685
83421X576
71628354X
7631X5842
17623X854
843X75126
63X452871
1X7564382
184X62735
X41368257
631X28745
234758X61
58X413276
654213X78
87341X265
1734685X2
34615X827
534816X72
1568X7342
X57134826
X14738652
36X728541
82631X745
87X654123
42536817X
5X3781462
X17562348
815X67243
673X25841
158436X27
416285X73
1X2435867
4758X3216
53862174X
73861452X
32415X876
X37628451
21638X574
43125X876
X45173826
46X285713
1627X3485
7865413X2
34725186X
1724683X5
17364825X
418635X72
257483X16
7625X3481
516X82437
54723X861
4235X6187
62781X345
X67351284
12576X483
83621X754
8641735X2
348X51276
2384576X1
X87536124
436X82751
13756X428
8574321X6
4561X7283
5324861X7
X68132745
324X76518
4X7386215
327X46185
38X652174
23X864517
2X4185367
6835X4217
13546X827
17X384256
368715X24
17823X546
5X8276143
6748X3215
X45618372
815643X27
5X2684713
X68321547
3217X4658
87435162X
6723X5841
24761538X
468X21357
X36257814
3451X2876
8672X5314
28416375X
57X184362
6X2143857
21X436758
1278635X4
3X1465278
32517X486
863245X71
182X34567
76X483152
643178X52
5481X3726
68X312745
83745216X
81326475X
453687X12
42638157X
25X814736
637X24851
52X378461
4X7132586
61847532X
26741853X
142867X35
3X1854726
57X243861
463178X52
71258436X
237X58641
267415X38
825X14736
17248X536
734162X58
384561X72
5712X3684
4632817X5
53462X871
824315X67
56814723X
X17435628
2678345X1
2X4156738
82X643517
2567X1834
8X5174632
25X418376
1X8376524
X83652741
3518X4726
83526714X
4152X6873
7612534X8
56X724381
31762548X
12637X854
852X64371
53X187624
X18724536
24158X673
6187X5342
27485163X
627453X81
X43728516
657X81324
3X1462587
473X12568
3546X8712
31X768425
23617845X
4182X3576
31X685472
413X65278
7X6548312
725168X34
3X1842756
64352X781
5236X4781
5834216X7
721486X35
47518263X
47251X683
86145273X
42613857X
75642X183
76X418352
31857264X
327845X16
3562781X4
547286X13
628135X74
15X726348
13548X672
73418256X
X78142365
X65713842
4167X8352
13874X265
84X351267
25X683714
17652X834
8645X1237
5734X8621
516234X78
82364157X
X48527631
67X851243
34576821X
516427X38
87165X342
26518374X
62X845731
X74163825
8X4563217
34X827651
31786X254
54X238617
4578X6231
1432X6875
38X567124
327X68541
X48167532
X56418372
67852341X
57413268X
16574X283
1X3426587
71826X453
5X2348671
7583X6241
5X4637128
54867312X
36X784152
468517X23
12347X685
78653X214
714538X62
78X215364
X61483752
5321X8764
X12368475
58427163X
1X8426537
412837X56
154X28637
317X48652
X52631478
54X271683
45168X723
842X16357
1X7436825
1X5746283
7168X5342
67X583142
X61254873
65X278143
X26431587
732X51468
458716X32
827X14563
27563481X
2471X6835
624378X51
87125X643
16428X573
68124X537
162X83475
48365X217
75462381X
85274X631
83165X742
X76245831
X81462735
643X51782
X25184367
17X243865
1452376X8
821654X73
164587X32
528614X37
8164X2735
42X357186
数据答案:
Case 1: 2
dd
Case 2: 8
urrulldr
Case 3: 0
Case 4: 18
rdrululddrrullurrd
Case 5: 17
ruulldrrdluurdlul
Case 6: 22
ruulldrdluurdrulldrrdl
Case 7: 23
uurdluldrdlururdluldrur
Case 8: 17
lddluurdrdllurdru
Case 9: 20
rrdluurddlulurdrdllu
Case 10: 23
rulldrrulldrulurdldrrul
Case 11: 24
drurdluldrrululdrurddlul
Case 12: 21
druuldrrulldrrdlurull
Case 13: 24
ddluurrddlurdllurulddrul
Case 14: 22
drdluurddruulddluurdld
Case 15: 25
ddrruuldldrulurdrulddrulu
Case 16: 18
ddrulurddluurdrdlu
Case 17: 19
lurdrulddrullurddlu
Case 18: 22
rruldrdluulddruulddrur
Case 19: 21
uuldrrdlluurdrulddluu
Case 20: 26
dldlururdldruuldlurddlurdr
Case 21: 24
ruurdllurrdlldrulurdrdll
Case 22: 24
rrululddrrululddruurdlld
Case 23: 22
lluruldrrdllururdldrul
Case 24: 15
uurdldrullurrdd
Case 25: 23
rrdluurdlldrruuldlurrdl
Case 26: 23
druldlurddruulldrdrulur
Case 27: 20
rdruldrdluruldrdlulu
Case 28: 21
dllurdrulddluurddruld
Case 29: 26
ldrurdluurddluulddruuldrrd
Case 30: 21
lurrdlldrulurdrdlluur
Case 31: 23
urrddllurdluurdrdllurul
Case 32: 18
ddlurulddruuldrrul
Case 33: 25
drurullddrruulldrdruulldr
Case 34: 17
urdluurrdluldrurd
Case 35: 19
rrddluurddlluruldrd
Case 36: 23
rddluurddruldluurdruldd
Case 37: 24
lurrdlluurdrulddluurdrul
Case 38: 24
lddruuldldrrulurdllurddl
Case 39: 18
rululddrrululddrur
Case 40: 20
druulddluurddruuldld
Case 41: 20
ddlurdrulurdlulddrru
Case 42: 23
drulurdruldlurrdldlurdr
Case 43: 21
uurdrulddluurddruuldd
Case 44: 26
druurddllurrulddluurdruldd
Case 45: 21
lurdlulddrurdluldruul
Case 46: 14
rdllurdrulurdl
Case 47: 26
rulldrulurrddlulurdruldldr
Case 48: 24
rdrdluurddluldrrullurddr
Case 49: 17
ldluurrdllurdldru
Case 50: 17
uldrruulddrulldrr
Case 51: 26
rddlluurddluurdrdlluurdrul
Case 52: 15
rurdllurrdldluu
Case 53: 27
rdrdlluurdrulddluurddruldlu
Case 54: 19
ldluurdrdlluurdrdll
Case 55: 22
uurdluldrdruulldrdluru
Case 56: 24
drullurdldrruuldlurddruu
Case 57: 26
rurdlluurddlurrdluuldrurdd
Case 58: 17
uurdllurrddluruld
Case 59: 25
dluldrurdldrullurdldruuld
Case 60: 27
ddlluurrdldrullurrddlulurdl
Case 61: 24
dluurrddlluurdrdlluurddl
Case 62: 18
lurrdlluruldrurdll
Case 63: 26
ddruldlurdruulldrrulldrrdl
Case 64: 19
ulurdruldlurdruldld
Case 65: 21
drulurdrdlluurdldruru
Case 66: 25
lurrdluulddruurddluurdldl
Case 67: 21
drruuldlurrdldlurdruu
Case 68: 20
ddruuldldrulurrdldru
Case 69: 16
llururddllurrdlu
Case 70: 24
dlluurddruulddruldluurdl
Case 71: 25
lddrullurrdluldrdluruldru
Case 72: 23
rdlurrdlurullddruruldlu
Case 73: 23
rdluurdldrurullddrruldl
Case 74: 24
dlurdlldrruldlururdluldd
Case 75: 22
dllurrdlurullddruurdld
Case 76: 15
dllurrullddruld
Case 77: 16
dluurdrulddruull
Case 78: 22
ddrurulddruuldlurddruu
Case 79: 25
dllurdluurrdluldrurddluur
Case 80: 23
luurdlldrrullurrdldluru
Case 81: 25
drdruldlurdrululddrruuldl
Case 82: 27
drruldruulldrrulldrdruuldld
Case 83: 21
uurrddluulddrulurdrul
Case 84: 22
lurrdllurrddlurdllurdr
Case 85: 25
llurrdlluurdruldrdluldrur
Case 86: 23
rdldrulurrddluurddluurd
Case 87: 19
uldldrurdllurdruull
Case 88: 22
dllurddlurdruulldrdrul
Case 89: 23
rululddruurdlulddruurdd
Case 90: 23
lururdluldrdluurdrulddr
Case 91: 26
uurrddlurdlluruldrurddluld
Case 92: 19
druulldrurdldruuldl
Case 93: 23
uldldrrulldruurdllurrdl
Case 94: 15
lurddluldrurull
Case 95: 22
ldluruldrruldrdluruldr
Case 96: 26
lurrdllurrulldrrulddruldlu
Case 97: 23
lururddlluurdrdluldruul
Case 98: 22
drrullurddlurdruulldrr
Case 99: 21
ruldluurdldrruullddru
Case 100: 25
urulddrullurdldruurddluul
Case 101: 22
drrulldruurddllurdluur
Case 102: 19
urdrulldrdruulddruu
Case 103: 23
ddllurdruldluruldrdluur
Case 104: 19
uldrdlurrulldrruldr
Case 105: 20
ldrdluurdluldrurddll
Case 106: 20
ullddruuldrurddlluru
Case 107: 20
ldrurdluldruurddlulu
Case 108: 21
rrululddruurdllurdrul
Case 109: 24
rdlurrddllurulddrurdllur
Case 110: 24
lurdlulurrddluldruulddru
Case 111: 17
uulddrulurdllurdl
Case 112: 20
druldrdruulldrdruuld
Case 113: 24
rullddrurdlulurrdlulddrr
Case 114: 23
dldlurrdluulddruurddluu
Case 115: 25
dlldrulurdldrruulddlurrdl
Case 116: 20
druldrdllurdruulddru
Case 117: 23
rrulldrrulldruurddluuld
Case 118: 8
dllurdld
Case 119: 26
rulldrurddlurdllurulddruur
Case 120: 24
llurdruuldrdllurrdllurrd
Case 121: 26
ruldrrullurrdllurddluurddr
Case 122: 25
dldlurrdluurddluurdllurdl
Case 123: 23
lddrullurdldruulddrruul
Case 124: 20
uulddlurdruullddrurd
Case 125: 23
rruullddrrulldrruuldlur
Case 126: 24
ddlluurdrdllurrdlluurdld
Case 127: 21
ulldruurdluldrdruulld
Case 128: 23
ruurdlldrruldluruldrdlu
Case 129: 13
llurddruulddl
Case 130: 24
ruulddruruldldrruulddlur
Case 131: 22
ruulldrdlururdluldrurd
Case 132: 18
uruldrrulddluurdrd
Case 133: 23
ddrrululddrrululddrruld
Case 134: 23
drdlluruldrruldrdlluurr
Case 135: 23
rullddruulddrurdluldruu
Case 136: 23
ddlluruldrdlururddlurul
Case 137: 18
rrdllurrddluurddlu
Case 138: 24
ulldrrululddruuldrrdllur
Case 139: 21
ruulddlurdrulldrulurr
Case 140: 19
ulldrulurrdldrulurd
Case 141: 25
rdrulldruuldrurdlulddruru
Case 142: 21
rdlurrdldrulldrrulurd
Case 143: 24
rdluurddlulurrddlluurdrd
Case 144: 22
uurrddllurdluurdrdlulu
Case 145: 24
rurddluldruulddrurdlluru
Case 146: 23
druurddluuldrrullddrrul
Case 147: 20
lddruulldrrulldrurdd
Case 148: 22
ldrulurdrdllurrulldrru
Case 149: 24
urdrulddluurdrdllurdluur
Case 150: 25
rruullddrrululddruldrruul
Case 151: 17
dllurulddrrululdr
Case 152: 25
ruldluruldrurddluurddluld
Case 153: 13
lulurrdluldrr
Case 154: 24
luurdllurdldrulurrddlurd
Case 155: 15
ldrululddrulurr
Case 156: 26
lluurrdllurddluurrddlurdll
Case 157: 19
luurdldrruldruulddl
Case 158: 16
rurullddrruuldru
Case 159: 23
llurddlurruldrdluulddrr
Case 160: 26
drdlurrdluurddluuldrdlurul
Case 161: 21
dluurdrulddruuldldrru
Case 162: 18
ldldrruullddrrulur
Case 163: 21
dluurdlldrruulldrurdl
Case 164: 26
dlurrdllururddluldruurddll
Case 165: 26
llurrdluruldrdlurulldrrull
Case 166: 24
ddlulurrddluurddlulurrdd
Case 167: 23
ruurdllurrddluruldlurrd
Case 168: 18
uuldlurrdllurddruu
Case 169: 21
drulddruurddlurulldru
Case 170: 19
lldrrdlluurdrulddru
Case 171: 20
ddluurddllurdrululdr
Case 172: 22
urdldluurddruulddlurru
Case 173: 25
rurdlulddrrulldruulddruul
Case 174: 16
rrdldluurddruldr
Case 175: 21
ululddruldrruuldldrur
Case 176: 22
ddluurdrdluruldlurddru
Case 177: 23
dldrulurrdlulddruulddru
Case 178: 11
drdluurdldr
Case 179: 22
dluldrurdllurdldrrulld
Case 180: 24
dlluruldrrdllururddluurd
Case 181: 22
urrdlluurdrulldrdrulur
Case 182: 24
rrdldluurddlurrdlluurrdl
Case 183: 28
rrddllurrdllurrdluuldrurdldr
Case 184: 17
drullddrurdllurdl
Case 185: 24
druuldrrdlluurrdldluruld
Case 186: 22
rdruldrdllurdruulddruu
Case 187: 24
dllurrdluulddrulurrdluld
Case 188: 24
ddlurruldrdllurrulddruul
Case 189: 24
uldrruldrdllurdrululdrur
Case 190: 24
rdrullddrurdluldrrullurr
Case 191: 23
ddrruuldlurddlurrdluuld
Case 192: 25
urrdllurdluurrdllurrdldlu
Case 193: 16
luruldldrruldlur
Case 194: 21
uurddlurruldrdlulurrd
Case 195: 18
dlluruldrrullddrur
Case 196: 20
rurddluulddruulddrur
Case 197: 19
lluurddlurrullddrur
Case 198: 27
lurddluulddruuldrrdllurrull
Case 199: 19
drrdluurddluurdluld
Case 200: 20
drurddllururdldrulur
Case 201: 17
ruldruulldrrulldd
Case 202: 22
rrululdrrulddruuldrdll
Case 203: 24
ulddruurdlldrrulurdldruu