LightOJ 1055Going Together (暴力搜索……繁琐)

来源:互联网 发布:如何使用花生壳域名 编辑:程序博客网 时间:2024/06/15 21:47

题目

一张n*n的格子图,上面有空地、障碍物、三个出口和三个小人;每次一条指令让他们往四个方向移动一格,不能动的原地不动,动的就移动一格;一个格子上最多同时只有一个人

思路

暴力bfs

const int dx[] = {0, -1, 0, 1};const int dy[] = {1, 0, -1, 0};bool mark[11][11][11][11][11][11];char mp[12][12];int n;struct node {    ii o1, o2, o3;    int t;    node(ii _a, ii _b, ii _c, int _t) {        o1 = _a;        o2 = _b;        o3 = _c;        t = _t;    }};queue<node> que;void setmark(ii t1, ii t2, ii t3) {    mark[t1.first][t1.second][t2.first][t2.second][t3.first][t3.second] = true;}bool check(int x, int y) {    return (x >= 1 && x <= n && y >= 1 && y <= n && mp[x][y] != '#');}int bfs(ii& t1, ii& t2, ii& t3) {    while(!que.empty()) que.pop();    memset(mark, false, sizeof mark);    que.push(node(t1, t2, t3, 0));    setmark(t1, t2, t3);    int ans = -1;    while(!que.empty()) {        node now = que.front();        que.pop();        int x1 = now.o1.first, y1 = now.o1.second;        int x2 = now.o2.first, y2 = now.o2.second;        int x3 = now.o3.first, y3 = now.o3.second;        int t = now.t;        if (mp[x1][y1] == 'X' && mp[x2][y2] == 'X' && mp[x3][y3] == 'X') {            ans = t;            break;        }        for (int i = 0;i < 4;++i) {            bool flag1 = false, flag2 = false, flag3 = false;            int _x1 = x1 + dx[i];            int _y1 = y1 + dy[i];            if (!check(_x1, _y1)) {                _x1 = x1;                _y1 = y1;                flag1 = true;            }            int _x2 = x2 + dx[i];            int _y2 = y2 + dy[i];            if (!check(_x2, _y2)) {                _x2 = x2;                _y2 = y2;                flag2 = true;            }            int _x3 = x3 + dx[i];            int _y3 = y3 + dy[i];            if (!check(_x3, _y3)) {                _x3 = x3;                _y3 = y3;                flag3 = true;            }            if (flag1 && flag2 && flag3) {                if (mark[_x1][_y1][_x2][_y2][_x3][_y3]) continue;                mark[_x1][_y1][_x2][_y2][_x3][_y3] = true;                que.push(node(ii(_x1, _y1), ii(_x2, _y2), ii(_x3, _y3), t + 1));            }else {                while (1) {                    bool flag = 0;                    if (!flag1 && flag2 && _x1 == _x2 && _y1 == _y2) {                        _x1 = x1, _y1 = y1;                        flag1 = 1;                        flag = 1;                    }                    if (flag1 && !flag2 && _x1 == _x2 && _y1 == _y2) {                        _x2 = x2, _y2 = y2;                        flag2 = 1;                        flag = 1;                    }                    if (!flag1 && flag3 && _x1 == _x3 && _y1 == _y3) {                        _x1 = x1, _y1 = y1;                        flag1 = 1;                        flag = 1;                    }                    if (flag1 && !flag3 && _x1 == _x3 && _y1 == _y3) {                        _x3 = x3, _y3 = y3;                        flag3 = 1;                        flag = 1;                    }                    if (!flag2 && flag3 && _x2 == _x3 && _y2 == _y3) {                        _x2 = x2, _y2 = y2;                        flag2 = 1;                        flag = 1;                    }                    if (flag2 && !flag3 && _x2 == _x3 && _y2 == _y3) {                        _x3 = x3, _y3 = y3;                        flag3 = 1;                        flag = 1;                    }                    if (!flag) {                        break;                    }                }                if (mark[_x1][_y1][_x2][_y2][_x3][_y3]) {                    continue;                }                mark[_x1][_y1][_x2][_y2][_x3][_y3] = true;                que.push(node(ii(_x1, _y1), ii(_x2, _y2), ii(_x3, _y3), t + 1));            }        }    }    return ans;}int main(int argc, const char * argv[]){        // freopen("/Users/jamesqi/Desktop/in.txt","r",stdin);    // freopen("/Users/jamesqi/Desktop/out.txt","w",stdout);    // ios::sync_with_stdio(false);    // cout.sync_with_stdio(false);    // cin.sync_with_stdio(false);    int kase;cin >> kase;    while(kase--) {        cin >> n;        Rep(i, 1, n) scanf("%s", mp[i] + 1);        ii t1, t2, t3;        Rep(i, 1, n) Rep(j, 1, n) {            if (mp[i][j] == 'A') t1 = ii(i, j);            if (mp[i][j] == 'B') t2 = ii(i, j);            if (mp[i][j] == 'C') t3 = ii(i, j);        }        int ans = bfs(t1, t2, t3);        if (ans == -1) printf("Case %d: trapped\n", ++nCase);        else printf("Case %d: %d\n", ++nCase, ans);    }    // showtime;    return 0;}
0 0
原创粉丝点击