Wumpus ZOJ月赛-3890

Wumpus

//一道广搜题,扩展时有三个状态左转、右转、前进;
//收取宝藏可以在前进的时候判断;状态的标记可以用
//一个四维数组标记即:坐标,方向,宝藏是否全部拾取;

# include <queue>
# include <cstdio>
# include <cstring>
# include <iostream>
using namespace std;

int n,change[30][30],vis[30][30][4][2],sum,flag;
int d[4][2] = {0,-1,-1,0,0,1,1,0};

struct  Point{
    int m[30][30];
    int x,y,f,step,t,flag;
    Point operator = (const Point &a){
        x = a.x;y = a.y;f = a.f;step = a.step;t = a.t;flag = a.flag;
        for(int i = 0;i < n;i++){
            for(int j = 0;j < n;j++)    m[i][j] = a.m[i][j];
        }
    }
}s;

void bfs(){
    queue <Point> q;
    s.x = n-1;
    s.y = s.step = s.t = s.flag= 0;s.f = 2;
    vis[n-1][0][s.f][0] = 1;
    q.push(s);
    while(!q.empty())
    {
        Point temp = q.front();q.pop();
        for(int i = 0;i < 3;i++){
            Point e = temp;
            if(e.x == n-1 && e.y == 0 && e.flag == 1){
                e.step++;
                flag = 1;
                printf("%d\n",sum*1000 - e.step*10);
                return ;
            }
            if(i == 0){
                e.f = (e.f - 1 + 4) % 4,e.step++;
                if(!vis[e.x][e.y][e.f][e.flag]){
                    vis[e.x][e.y][e.f][e.flag]=1,q.push(e);
                }
            }
            else if(i == 1){
                e.f = (e.f + 1) % 4,e.step++;
                if(!vis[e.x][e.y][e.f][e.flag]){
                    vis[e.x][e.y][e.f][e.flag]=1,q.push(e);
                }
            }
            else if(i == 2){
                e.x += d[e.f][0],e.y += d[e.f][1],e.step++;
                if(e.x>=0 && e.x<n && e.y>=0 && e.y<n && !vis[e.x][e.y][e.f][e.flag]
                   && (e.m[e.x][e.y]==0 || e.m[e.x][e.y]==3)){
                    q.push(e);
                    vis[e.x][e.y][e.f][e.flag] = 1;
                    if(e.m[e.x][e.y] == 3){
                        e.m[e.x][e.y] = 0;
                        e.step++,e.t++;
                        if(e.t == sum)    e.flag = 1;
                        vis[e.x][e.y][e.f][e.flag] = 1;
                        q.push(e);
                    }
                }
            }
        }
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int a,b,c,f = 0;
        sum = flag = 0;
        memset(change,0,sizeof(change));
        memset(vis,0,sizeof(vis));
        scanf("%d",&n);
        while(scanf("%d%d%d",&a,&b,&c)&& a != -1){
            change[b][c] = a;
            if(a == 2 && !b && !c)  f = 1;
            if(a == 3)  sum ++;
        }
        for(int i = 0;i < n;i++){
            for(int k = 0,j = n - 1;k < n && j >= 0;k++,j--)    s.m[j][i] = change[i][k];
        }
        if(f || !sum){
            printf("-1\n");     continue;
        }
        else    bfs();
        if(!flag)   printf("-1\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 20:21:04

Wumpus ZOJ月赛-3890的相关文章

zoj 3890 Wumpus(zoj 2015年7月月赛)

Wumpus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day Leon finds a very classic game called Wumpus.The game is as follow. Once an agent fell into a cave. The legend said that in this cave lived a kind of monster called Wumpus, and there we

zoj 月赛

141 - ZOJ Monthly, July 2015 - H Twelves Monkeys Time Limit: 5 Seconds      Memory Limit: 32768 KB James Cole is a convicted criminal living beneath a post-apocalyptic Philadelphia. Many years ago, the Earth's surface had been contaminated by a virus

有趣的数 zoj 月赛

题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的位置为Q(N,K),例如Q(11,2)=4.现在给出整数K和M,要求找到最小的N,使得Q(N,K)=M. 输入输出格式 输入格式: 输入文件只有一行,是两个整数K和M. 输出格式: 输出文件只有一行,是最小的N,如果不存在这样的N就输出0. 输入输出样例 输入样例#1: 复制 2 4 输出样例#1: 复制 11 输入样例

ZOJ3802 Easy 2048 Again (状压DP)

ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334 Easy 2048 Again Time Limit: 2 Seconds      Memory Limit: 65536 KB Dark_sun knows that on a single-track road (which means once he passed this

zoj3802:easy 2048 again(状压dp)

zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<=500 , a[i]={2,4,8,16}: 分析: 首先明确一下自动合并的意思,比如原有 8,4,2,进入一个2 就会变成16 所以我们需要记录前面的所有数字..计算了一下发现最大情况,500个16会合成4096 =2^12 显然全部记录是不可能的.那么怎么处理呢 我们发现,只有递减的序列才有可能向前合

没有acm我会是什么?

我大一开始开始ac,那时候我并不算的上是搞acm,做的题目没有算法,只是水体,只能算是练习c语言. 大一下学期开始学算法,也只是基本的,深搜啊,广搜啊,背包啊,那时候看01背包都感觉好难,看了很久. 第二上学期开始刷小白书的题目. 这一年玩玩学学,效果不大,虽然在学,但是也玩lol,穿越火线,浪费了很多时间. 真的开始转变的是大二寒假,那时候看了大白书,发现自己知道的太少,自己也太水,zoj月赛经常做不出几个题目,很郁闷,但是我固执,不想退出,队友也不学,于是我戒掉了 游戏,每天开起学霸模式做题

ZOJ-3504 P-norm(py大法好)

昨天下午训练选用的是ZOJ月赛watashi大神出的题目(记得第一次接触watashi的时候是学习怎么写oj提交机器人,虽然看不懂,但是最后用py大法完美解决了.) 题目Link : http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3504 这题目,用c++我觉得写起来很费劲,说到底就是计算p范数. 有3行输入,比如 (1,0) (0,1) (-1,0) (0,-1) (1,0) (0,-1) (-1,0) (0,1) 1

山东省第八届ACM省赛游记

Day 1: 凌晨,来了几分兴致,和队友在VJudge上开了一把zoj月赛,WA一发闷一口拿铁,一瓶拿铁 不一会就被喝完了!好气啊!遂开始愉快地打游戏,打着打着,woc,居然3点半了,小睡片 刻,咬上几口面包,便乘着校车前往了青科. 到达目的地的 First Impression:志愿者超赞!经过各种排队,场面很有秩序,衣服颜色有点奇怪. About 食宿:又饿又困,所以吃到饭碰到床的时候特别开心,总体来讲,挺舒适的! About 开幕式:演讲者各种"山东","青岛"

ZOJ - 3890 Wumpus(BFS基础题)

Wumpus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day Leon finds a very classic game called Wumpus.The game is as follow. Once an agent fell into a cave. The legend said that in this cave lived a kind of monster called Wumpus, and there we