求最短通关的按键次数。
马上可以想到是广搜。。。 简单题。
注意的地方是,两者水平上移动方向相反。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int dir[4][2] = { -1, 0, 0, 1, 1, 0, 0, -1 };
char map[20][20];
bool flagin[20][20][20][20];
struct node {
int lx, ly, rx, ry, cnt;
} coo[5000];
bool walk(int x, int y) {
if (map[x][y] != '#')
return true;
return false;
}
bool open(int pos) {
if (coo[pos].lx == 1 && coo[pos].rx == 1 && coo[pos].ly == 7 && coo[pos].ry
== 9)
return true;
return false;
}
int ans;
void BFS() {
int fi, la, nlx, nly, nrx, nry, ncnt;
int i;
bool flag1, flag2;
fi = la = 0;
coo[fi].lx = 10;
coo[fi].ly = 7;
coo[fi].rx = 10;
coo[fi].ry = 9;
coo[fi].cnt = 0;
flagin[10][7][10][9] = true;
la++;
while (fi < la) {
ncnt = coo[fi].cnt + 1;
if (ncnt > 100)
return;
if (open(fi)) {
ans = ncnt - 1;
return;
}
for (i = 0; i < 4; ++i) {
nlx = coo[fi].lx + dir[i][0];
nly = coo[fi].ly + dir[i][1];
nrx = coo[fi].rx + dir[i][0];
nry = coo[fi].ry - dir[i][1];
flag1 = walk(nlx, nly);
flag2 = walk(nrx, nry);
if (flag1 && flag2) {
if (!flagin[nlx][nly][nrx][nry]) {
flagin[nlx][nly][nrx][nry] = true;
coo[la].lx = nlx;
coo[la].ly = nly;
coo[la].rx = nrx;
coo[la].ry = nry;
coo[la].cnt = ncnt;
la++;
}
}
if (flag1 && !flag2) {
if (!flagin[nlx][nly][coo[fi].rx][coo[fi].ry]) {
flagin[nlx][nly][coo[fi].rx][coo[fi].ry] = true;
coo[la].lx = nlx;
coo[la].ly = nly;
coo[la].rx = coo[fi].rx;
coo[la].ry = coo[fi].ry;
coo[la].cnt = ncnt;
la++;
}
}
if (!flag1 && flag2) {
if (!flagin[coo[fi].lx][coo[fi].ly][nrx][nry]) {
flagin[coo[fi].lx][coo[fi].ly][nrx][nry] = true;
coo[la].lx = coo[fi].lx;
coo[la].ly = coo[fi].ly;
coo[la].rx = nrx;
coo[la].ry = nry;
coo[la].cnt = ncnt;
la++;
}
}
}
fi++;
}
return;
}
int main() {
int cas = 0, i, j;
memset(map, '#', sizeof(map));
while (scanf(" %s", &map[1][1]) != EOF) {
map[1][16] = '#';
for (i = 2; i <= 10; ++i) {
scanf(" %s", &map[i][1]);
map[i][16] = '#';
}
memset(flagin, false, sizeof(flagin));
ans = -1;
BFS();
if (ans == -1)
printf("Case %d: They can't break open the cage!\n", ++cas);
else
printf("Case %d: %d\n", ++cas, ans);
memset(map, '#', sizeof(map));
}
return 0;
}