蒟蒻的写题方法的探索

1.先写大体框架,再写小函数与变量

测试题目:https://www.acwing.com/problem/content/174/

框架如下:

#include<bits/stdc++.h>
using namespace std;

struct rec{
    int x,y,lie;
}st,ed;

void get_st_ed()
{
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    {

    }
}

void input()
{
    for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
    get_st_ed();
}

int work()
{
    queue<rec>q;
    q.push(st);
    while(!q.empty())
    {
        rec now=q.front(); q.pop();
        for(int i=0;i<4;++i)
        {
            rec nxt;
            nxt.x=now.x+nxtx[now.lie][i];
            nxt.y=now.y+nxty[now.lie][i];
            nxt.lie=nxtlie[now.lie][i];
            if(!valid(nxt)) continue;
            if(d[nxt.x][nxt.y][nxt.lie]==-1)
            {
                d[nxt.x][nxt.y][nxt.lie]=d[now.x][now.y][now.lie]+1;
                if(nxt.x==ed.x&&nxt.y==ed.y&&nxt.lie==ed.lie)
                    return d[nxt.x][nxt.y][nxt.lie];
            }
        }
    }
    return -1;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF && n && m)
    {
        input();
        int ans=work();
        if(ans==-1) cout<<"Impossible";
        else cout<<ans;
        cout<<'\n';
    }
    return 0;
}

完整代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
const int li=3;

struct rec{
    int x,y,lie;
}st,ed;

int n,m;
int d[maxn][maxn][li];
char s[maxn][maxn];

int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};

bool valid(int x,int y)
{
    return (x>=1&&y>=1&&x<=n&&y<=m);
}

void get_st_ed()
{
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    if(s[i][j]=='O') {
        ed.x=i, ed.y=j, ed.lie=0;
        s[i][j]='.';
    }
    else if(s[i][j]=='X') {
        for(int k=0;k<4;++k)
        {
            int nx=i+dx[k], ny=j+dy[k];
            if(!valid(nx,ny) || s[nx][ny]!='X') continue;
            st.x=min(i,nx), st.y=min(j,ny);
            if(k==0||k==1) st.lie=1;
            if(k==2||k==3) st.lie=2;
            s[i][j]=s[nx][ny]='.';
        }
        if(s[i][j]=='X') {
            s[i][j]='.';
            st.x=i, st.y=j;
            st.lie=0;
        }
    }
}

void input()
{
    for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
    get_st_ed();
}

int nxtx[li][4]={{-2,1,0,0},{-1,2,0,0},{-1,1,0,0}};
int nxty[li][4]={{0,0,-2,1},{0,0,-1,1},{0,0,-1,2}};
int nxtlie[li][4]={{1,1,2,2},{0,0,1,1},{2,2,0,0}};

bool valid(rec &tmp)
{
    if(!valid(tmp.x,tmp.y)) return false;
    if(s[tmp.x][tmp.y]=='#') return false;
    if(tmp.lie==0 && s[tmp.x][tmp.y]=='E') return false;
    if(tmp.lie==1 && (s[tmp.x+1][tmp.y]=='#' || !valid(tmp.x+1,tmp.y))) return false;
    if(tmp.lie==2 && (s[tmp.x][tmp.y+1]=='#' || !valid(tmp.x,tmp.y+1))) return false;
    return true;
}

int work()
{
    memset(d,-1,sizeof d);
    queue<rec>q;
    q.push(st); d[st.x][st.y][st.lie]=0;
    while(!q.empty())
    {
        rec now=q.front(); q.pop();
        for(int i=0;i<4;++i)
        {
            rec nxt;
            nxt.x=now.x+nxtx[now.lie][i];
            nxt.y=now.y+nxty[now.lie][i];
            nxt.lie=nxtlie[now.lie][i];
            if(!valid(nxt)) continue;
            if(d[nxt.x][nxt.y][nxt.lie]==-1)
            {
                d[nxt.x][nxt.y][nxt.lie]=d[now.x][now.y][now.lie]+1;
                q.push(nxt);
                if(nxt.x==ed.x&&nxt.y==ed.y&&nxt.lie==ed.lie)
                    return d[nxt.x][nxt.y][nxt.lie];
            }
        }
    }
    return -1;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF && n && m)
    {
        input();
//      printf("%d %d %d\n",st.x,st.y,st.lie);
//      printf("%d %d %d\n",ed.x,ed.y,ed.lie);
        // accepted in test of get_st_ed();
        int ans=work();
        if(ans==-1) cout<<"Impossible";
        else cout<<ans;
        cout<<'\n';
    }
    return 0;
}

总结:个人应用这种方法时,写代码时间主要用在DEBUG上,框架不易出错,小函数容易出错,是我的锅qwq

原文地址:https://www.cnblogs.com/tztqwq/p/12000815.html

时间: 2024-10-10 13:07:40

蒟蒻的写题方法的探索的相关文章

震惊!一蒟蒻竟然写出fhqTreap

震惊,我竟然写出了fhq Treap 先%fhq大佬 然后%zxy大佬 节点定义 struct node { int w,siz,rdm;//权值,大小(包括自己),随机数 int l,r;//左右儿子 } nd[MAXN]; 特有操作 fhq Treap也被叫做无旋Treap,它通过分裂与合并来维持平衡和堆的性质. 按值分裂 将树分成x,y两颗树,其中x中的元素都小于等于w,y中的元素都大于w. 按地址传参,调用后x,y为新树的根. 开始写的传指针,但我太弱了一直没写对 void splitV

BZOJ3786 星系探索 蒟蒻出题人给跪

本蒟蒻闲得蛋疼于是在BZOJ上加了一道水题,果然被瞬间水过... 只能说本蒟蒻实在是太弱了. Q:你为什么要写这篇博客? A:我只是为了水经验233.... 正常向的数据.题解.标程请自行传送下面的云盘... http://pan.baidu.com/s/1qWsMHM8 吐槽: 为什么本地不开O2 10s在OJ上开O2 还需要20+s啊!!!我本来不想卡常数好不好. 因为这个原因用数组实现数据结构被卡的请见谅...现在是40s应该卡不掉了. 另外如果发现自己被卡掉请重交一次.原因不解释. 为什

蒟蒻ACMer回忆录 &#183; 一段弱校ACM的奋斗史

三年半的ACM生涯终于迎来了终点,退役之时,感慨万分,故写此文以纪念逝去的时光,那些为ACM拼搏的日子,那段弱校ACM的奋斗史. 三年半的ACM生涯,窝见证了CUMT从打铁到铜牌的突破,又见证了从铜牌到银牌的突破:见证了集训队员从3人发展到10余人,又见证了ACM实验室的落实. 三年半的ACM生涯,窝经历了太多,有Accepted时的欢笑,有Wrong Answer时的沮丧,有Time Limit Exceeded时的无奈,有Runtime Error时的尴尬,有打铁的失落,有拿牌的惊喜. 13

算法描述》LCA两三事(蒟蒻向)

LCA是图论中常用的解决树形结构子问题的工具,这一问题一般需要用一个简短的子函数直接解决,但是这对于广大蒟蒻们仍然是一个不小的问题. LCA是指在树形结构中两点的最近公共祖先,对于这个问题,直接向上找事最直接的方法,但同时时间复杂度和数据给出的生成树的层数有关,最优情况是logN级别的,但是如果数据给出的是一条链就GG了,所以要用更优的方法写,一般来说,用的是log2N的操作,最糟糕的复杂度也是logN级别的,那如何实现这一过程捏,我这里有两种方法,和大家分享 第一种:树上倍增 具体方法是对于已

noip2013Day2T3-华容道【一个蒟蒻的详细题解】

描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的: 有些棋子是固定的,有些棋子则是可以移动的: 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白

bzoj2141排队(辣鸡但是好写的方法)

题意很明确,也非常经典: 一个支持查询 区间中比k大的数的个数 并且支持单点修改的序列 ——因为题意可以转化为:查询这两个数中比后者大的个数.比后者小的个数.比前者大的个数.比前者小的个数(根据这4个就能算出增加/减少了多少对逆序对)并且把两个数修改掉 于是就出现了 ——来自百度 一个二分就能解决套个卵蛋woc身为一个蒟蒻,表示没有一个写得出的 于是我就想了一个好写(Rank100+几乎T掉)的方法: 首先复制一份原数据,把一份分块,并且保证每一块中的单调(也就是调用sqrt(n)次排序) 然后

dp专场的蒟蒻题解

前言:一直想练练dp,正好衣神弄了个训练赛..上次看cgold大佬的题解心血来潮所以自己试着写了第一次题解..可惜本蒟蒻的能力太差有两道题做不太出,只好搬运学习其它大佬的题解了.. a题 https://vjudge.net/contest/355951#problem/A 这题做题的过程十分痛苦 我又双叒叕看错题意了.. 以为是必须在对角线上 其实是随便n*n的都行.. 大概思路是从一个角开始更新,统计左边和上边相同的长度 #include <iostream> #include <c

论蒟蒻的自我修养

作为一个蒟蒻,离开大神还有很大一段距离(更不用说神犇了).作为一个想成为SB的SX,自我修养是及其重要的.即使初三老师丧心病狂,也不能放弃这条路恩! 计划: 恩不去MO但是学习他们的那些书~~毕竟数学渣 = ^ = 然后是数据结构...我最弱的一块辣 然后是算法...我也不强 解题思路 啊啊啊!!!差得要命!!! 写程序 啊啊啊!!要死辣!! 所以要多写多练撒!! 要开始刷题了撒!! BZOJ的题目都不会啊!!要死了撒! 估计学一下MO还是有好处的..至少OI MO不分家~~MO主要是数论和排列

博主自传——蒟蒻的OI之路

博主来自河北石家庄市第二中学,现在读高二,主攻信息学竞赛(其实并没有学习其他学科竞赛). NOIP中人品大爆发,使劲挤进河北省一等奖队伍,侥幸留在竞赛团队中(差点就淘汰出局啦). 关于我的ID,YOUSIKI,就是那四个平假名,没有什么实际意义.若搜到日本某艺人,和我无关. NOIP前主要活跃在PekingUniversityOnlineJudge(不知道拼错木有),现在主要活跃在Lydsy(小伙伴们都叫他BZOJ). 在各个OJ上基本都有号(有大号也有小号),ID都是YOUSIKI.Tyvj,