2017暑假集训第二天

来源:互联网 发布:java 蓝牙通信协议 编辑:程序博客网 时间:2024/06/05 03:43

  今天的集训着实有些郁闷,上午完成了一道简单的搜索水题(Dungeon Master-一个三维的搜索,细节比较多,但着实简单)之后便被卡死在了一个细节更多的题(Children of the Candy Corn)上面,这个题的难点在于控制方向,但之前我对代码中方向的理解不深刻,导致处处受挫,但最终在自己的思维和修改下完成了方向的控制,但细节过多,下午又有比赛,于是放弃了这道题的求解,控制方向的方法的关键代码如下:

  struct point{
    int x;
    int y;
    int step;//记录上一个状态下的方向
    int fun;
  };

        if (topp.x==ex&&topp.y==ey){
            judge=1;
            return topp.step;
        }
        if (topp.fun==1&&map[topp.x+xx[2]][topp.y+yy[2]]!='#'&&ok(topp.x+xx[2],topp.y+yy[2])){
            point newp;
            newp.x=topp.x+xx[2];
            newp.y=topp.y+yy[2];
            newp.step=topp.step+1;
            newp.fun=3;
            qq.push(newp);
        }
        else if (topp.fun==2&&map[topp.x+xx[3]][topp.y+yy[3]]!='#'&&ok(topp.x+xx[3],topp.y+yy[3])){
            point newp;
            newp.x=topp.x+xx[3];
            newp.y=topp.y+yy[3];
            newp.step=topp.step+1;
            newp.fun=4;
            qq.push(newp);
        }
        else if (topp.fun==3&&map[topp.x+xx[1]][topp.y+yy[1]]!='#'&&ok(topp.x+xx[1],topp.y+yy[1])){
            point newp;
            newp.x=topp.x+xx[1];
            newp.y=topp.y+yy[1];
            newp.step=topp.step+1;
            newp.fun=2;
            qq.push(newp);
        }

        else if (topp.fun==4&&map[topp.x+xx[0]][topp.y+yy[0]]!='#'&&ok(topp.x+xx[0],topp.y+yy[0])){
            point newp;
            newp.x=topp.x+xx[0];
            newp.y=topp.y+yy[0];
            newp.step=topp.step+1;
            newp.fun=1;
            qq.push(newp);
            //if (newp.step<=5)cout<<newp.x<<' '<<newp.y<<' '<<newp.fun<<' '<<newp.step<<endl;
        }

  方法就是简单的记录和处理转向,但是细节较多。

  下午的练习赛中在规定时间只做出了第二个题,(第一题赛后一分钟发现原来是“ccw"写成了”cww"以至于数次未完成。

  大部分的时间浪费在了第三题的思维上,看题解后认为大致类似,都是找3次方,但我是分开a和b找,方法就是筛素数,找到a和b的素因子,并统计个数,以3次方为基准多的减二少的减一,最终如果正好为0(也就是3次方)那么符合条件,如果出现负数,则impossible,但估计是除法未处理妥当,导致runtime error,未完成该题,方法欠妥,也是思维脑洞开的不大。

  晚上的训练做了一个较难的搜索题,难点在记录路径上,这里,用的方法就不再是传统的dfs的模板中的queue方式,而是直接开数组,并用结构体中pre记录上一个元素在数组中的位置,最后用下标回溯,得到记录的路径,最后反向输出既得结果。回溯代码如下:

void print(){
    total=0;
    while (t!=0){
        total+=1;
        pot[total]=p[t].fun;
        t=p[t].pre;
    }
    cout<<total<<endl;
    for (int i=total;i>=1;i--){
        cout<<aa[pot[i]]<<endl;
    }
}

  完成今天的训练之后认为自己效率略低,脑洞太小, 还需要多看博客,加大自己对题目的理解,以提高自己的爆发力等其他实力,而不是闷头刷题,这样了解题目的速度过慢,而且略有被动。

 

 


       

原创粉丝点击