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

题目

一张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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值