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

HDU 3912 Turn Right 2011 模拟 Multi-University Training Contest 8 - Host by HUST

(2011-08-05 09:36:09)
标签:

hdu

3912

turn

right

2011

模拟

it

分类: 搜索
题目描述:
从入口开始,按照右前左后的顺序走,“走出”出口,即最后一步是走出边界的,然后再进入出口,此时,显然面向上方,再按上述方法走回入口,问是否遍历完所有点。
解题报告:
模拟,注意转向的处理,用数组,四个方向+1取模比较方便。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[600][600][4];
int move[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
int now;
int g[600][600][4], vst[600][600], st, ed, n, m, ans;
int tara, tarb;
bool dfs(int ii, int jj, int tar)
{
    if (!vst[ii][jj])
    {
        vst[ii][jj] = 1;
        ans++;
    }
    for(int i = 0; i < 4; i++)
    {
        int id = ((tar - 1 + 4) % 4 + i) % 4;
        int tmpa = ii + move[id][0], tmpb = jj + move[id][1];
        if (tmpa >= 0 && tmpa < n && tmpb >= 0 && tmpb < m && g[ii][jj][id] != 1 && !dp[tmpa][tmpb][id])
        {
            dp[tmpa][tmpb][id] = true;
            return dfs(tmpa, tmpb, id);
        }else
        {
            if (tmpa == tara && tmpb == tarb) return true;
        }
    }
    return false;
}

int main()
{
    int t;scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d%d%d", &n, &m, &st, &ed);
        memset(g, 0, sizeof(g));
        for(int i = 0; i < n + n - 1; i++)
        {
            if (i & 1)
            {
                for(int j = 0; j < m; j++)
                {
                    int tmp;scanf("%d", &tmp);
                    if (tmp)
                    {
                        g[i / 2][j][2] = 1;
                        g[i / 2 + 1][j][0] = 1;
                    }
                }
            }else
            {
                for(int j = 0; j < m - 1; j++)
                {
                    int tmp;scanf("%d", &tmp);
                    if (tmp)
                    {
                        g[i / 2][j][3] = 1;
                        g[i / 2][j + 1][1] = 1;
                    }
                }
            }
        }
        memset(vst, 0, sizeof(vst));
        ans = 0;
        tara = n, tarb = ed;
        memset(dp, 0, sizeof(dp));
        bool flag1 = dfs(0, st, 2);
        tara = -1, tarb = st;
        memset(dp, 0, sizeof(dp));
        bool flag2 = dfs(n - 1, ed, 0);
        while(!flag1 || !flag2) new int;
        if (ans == n * m) printf("YES\n");
        else printf("NO\n");

    }
    return 0;
}

0

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

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

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

新浪公司 版权所有