加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 1915 双向广搜

(2010-08-25 13:32:09)
标签:

poj

pku

1915

双向广搜

it

分类: 搜索

题目描述:

不描述。

解题报告:

很早就过这道题目了,但是昨天的多校联合集训中1004是一个用双向广搜解决的八数码问题,没有做出来,特此来练习一下双广。

代码很短:

#include<iostream>
using namespace std;
int vst[300][300][2], pos[2][2];
int move[8][2] = {2, 1, 2, -1, -2, 1, -2, -1, 1, -2, 1, 2, -1, -2, -1, 2};
struct jeo
{
    int x, y;
}que[300 * 350][2];
int main()
{
    int t;scanf("%d", &t);
    for(int i = 0; i < t; i++)
    {
        int l; scanf("%d", &l); int ans = 0;
        memset(vst, 0, sizeof(vst));
        int head[2], tail[2]; head[0] = head[1] = tail[0] = tail[1] = 0;
        for(int i = 0; i < 2; i++)
        {
            for(int j = 0; j < 2; j++) scanf("%d", &pos[i][j]);
            vst[pos[i][0]][pos[i][1]][i] = 1;
            que[tail[i]][i].x = pos[i][0], que[tail[i]++][i].y = pos[i][1];
        }
        if (pos[0][0] == pos[1][0] && pos[0][1] == pos[1][1]) goto lable;
        while(head[0] < tail[0] && head[1] < tail[1])
            for(int i = 0; i < 2; i++)
            {
                jeo jeogia = que[head[i]++][i];
                for(int j = 0; j < 8; j++)
                {
                    int a = jeogia.x + move[j][0], b = jeogia.y + move[j][1];
                    if (a >= 0 && a < l && b >= 0 && b < l && !vst[a][b][i])
                    {
                        vst[a][b][i] = vst[jeogia.x][jeogia.y][i] + 1;
                        que[tail[i]][i].x = a; que[tail[i]++][i].y = b;
                    }
                    if (a >= 0 && a < l && b >= 0 && b < l && vst[a][b][i ^ 1])
                    {
                        ans = vst[a][b][i] + vst[a][b][i ^ 1] - 2;
                        goto lable;
                    }
                }
            }
        lable:
        printf("%d\n", ans);
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有