2017.7.31 暑假集训第一天

        正式集训开始了,这份题是搜索图论的、用来复习以前课堂上讲的知识,话说真的是忘光了、而且我刷的题量太少了,入队条件那100道,就属我做的最少、没有做到搜索部分,所以真的是忘得很彻底!
      一开始做的第一题,题意就很难理解,好不容易根据样例讲题以理解的差不多~传来消息说网站进不去了?!?!立马截了张图,继续做这一个题。
     这个题数据量不大,但是因为对题型训练的少,做起来有点费劲儿,最后做出来了,自己试了多组数据,感觉没有问题,但愿明天提交能过!!!祈祷~
      题意:有T组样例,类似于我国象棋马走日,从矩阵n行m列(1.,,,n,A、B....)、任意位置开始,走日字,最后能够经过所有位置,有且仅有一次,输出字典排序法最小的一种走法(1<=n,m<=8,0<n*m<26)
     这是一个深搜题,也可以说是递归了,但是一开始读题时漏了题意要数传字典排序法最小的一组,以为随意输出一种就可,后来跟同学讨论时,发现了自己的错处,经过思考,控制行走方向数组的大小,先考虑排序小的位置即可。
    思路:从初始位置开始,对于每一个位置,进行八个方向的判别(从字典排序小的开始),看是否能走,走过的位置记录下来(值为1走过,值为0没走过、)并存进路程数组,一直判断n*m步,如果能走n*m步,那一定走完,输出,记录已经输出,后面即便符合条件也不用再看了、再就是输出的时候注意一下就可以了、
   代码:

#include<bits/stdc++.h>
using namespace std;
int dd[66],a[9][9],pp,qq,C;
int a1[8]={-1,1,-2,2,-2,2,-1,1};
int b1[8]={-2,-2,-1,-1,1,1,2,2};//顺序,决定按字典排序法找、
int display(int p,int q)
{
    for(int i=1;i<=p*q;i++)
    {
        char z=dd[i]%10+'A'-1;
        cout<<z<<dd[i]/10;
    }
    cout<<endl;
}
int sousuo(int aa,int bb,int z)//当前位置aa,bb,第z步
{dd[z]=aa*10+bb;a[aa][bb]=1;
    if(z==pp*qq) {C=1;display(pp,qq);return 0;}

    for(int i=0;i<8;i++)
    {
        if(a[aa+a1[i]][bb+b1[i]]==0&&C==0&&aa+a1[i]>=1&&aa+a1[i]<=pp&&bb+b1[i]>=1&&bb+b1[i]<=qq)
         {
         sousuo(aa+a1[i],bb+b1[i],z+1);
        // cout<<aa<<" "<<bb<<" "<<z<<endl;
         }

    }
    a[aa][bb]=0;

}
int main()
{
    int T,i,j,k;
    char A;
    cin>>T;
    for(k=1;k<=T;k++)
    {C=0;
    memset(a,0,sizeof(a));
        cin>>pp>>qq;
        cout<<"Scenario #"<<k<<":"<<endl;
        for(j=1;j<=qq;j++)
        for(i=1;i<=pp;i++)
        {
            sousuo(i,j,1);
        }
        if(C==0) cout<<"impossible"<<endl;
        if(k!=T) cout<<endl;
    }
}
下午的时候就看以前的课件,昏昏欲睡、深深感觉学的都还给了老师。。单看课件也还是有点蒙,以后还是要多刷题,刷题要及时、才能对知识点进行巩固

网站好了以后,继续做题、虽然不能下午的时候还不能交,就只找了几道以前做过的(1004,1006),这两道题比较简单、

晚上能提交后都提交了,所幸都对了,又做了1007,也是以前做过的、但是忘记怎么做了,又好好想,是广搜

题意:输入一个n,求m是n的倍数,并且只有0,1组成、从1开始入栈,依次*10和*10+1入栈,然后依次出栈,注意范围即可

做的这几个题,我知道自己的广搜比较欠缺,深搜与递归太类似,所以相对而言掌握的较好、最近这一个周,就要在广搜上下下功夫了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值