学习记录6

上午

听20年6月的英语四级听力,一小时。

并尝试写出“单词方阵”,嗯,下午才写出来……代码和问题放在下午那一块吧。

又学了些c++的函数,现在已经差不多可以使用c++来写题目了,具体学了:

1,包含在#include <algorithm>中的min和max函数,还有同样包含在这个库里的sort函数,这个可好用了

2,包含在#include <cstring>中的memset函数,此函数可以给一整个变量赋值,主要用它给数组赋初值。

3,包含在#include <queue>中的queue,这玩意是个队列,可以得出队首,假如队列名为q,则q.front(),弹出队首,q.pop(),添加元素为q.push()。

下午

嗯,继续写”P1101 单词方阵“,终于写出来了……

题目是:

 得出来的答案代码是:

#include <iostream>
#include <string.h>

using namespace std;

char g[8]="yizhong",book[110][110];
bool mark[110][110],anse[110][110];
int n,path[8][2]={{1,0},{-1,0},{1,1},{-1,-1},{-1,1},{1,-1},{0,1},{0,-1}};
void dfs(int x,int y,int st,int p)//此P即为所谓的始终一个方向,st为对应的单词字母位置
{
    if(book[x][y]==g[st])
        {
            if(st==6)
            {
                mark[x][y]=1;
                for(int i=0;i<102;i++)
                    for(int j=0;j<102;j++)
                        if(mark[i][j]==1)
                            anse[i][j]=1;//用此数组记录正确单词位置
                memset(mark,0,sizeof(mark));//为方便下次使用此数组而全部赋值为0
                return;
            }
        else
            if(st<6)
                mark[x][y]=1;
        }
    else {
            memset(mark,false,sizeof(mark));//一旦某路径单词对照出错,则推出并给标记数组归零
            return;
        }
       int xx=x+path[p][0];
       int yy=y+path[p][1];
    if(!(xx<0||xx>=n||yy<0||yy>=n)&&book[xx][yy]==g[st+1])
        dfs(xx,yy,st+1,p);
}
int main()
{
   scanf("%d\n",&n);
   for(int i=0;i<n;i++)
    cin >> book[i];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            if(book[i][j]=='y')//首先找出单词首位’y‘的位置
                {
                    for(int k=0;k<8;k++)//八个方向寻找是否有符合单词的字母
                        if(book[i+path[k][0]][j+path[k][1]]==g[1])
                            {
                                mark[i][j]=1;//一旦有,先给’y'的位置标记好,剩下的在dfs中会标记
                                dfs(i+path[k][0],j+path[k][1],1,k);
                                memset(mark,false,sizeof(mark));//因为即便某条路径并不正确可在回溯过程中mark中元素还会被赋值为1,所以在这里给他全部赋值0

                            }
                }
    for(int i=0;i<n;i++)//既然做了标记的是单词,那么无标记的便可覆盖为*
        for(int j=0;j<n;j++)
            if(anse[i][j]==0)
                book[i][j]='*';
   for(int i=0;i<n;i++)
        puts(book[i]);
}

主要遇到的困难有,一开始不知道怎样实现”唯一方向“这东西,吃了好多苦头才突然突发奇想,给它整出来了。还有,尽管我知道需要给mark数组重新赋值为0,可由于没考虑到每条路径,所以有些错误。其他问题在注释中有解释。

尝试继续写昨天没写出来的”P1135 奇怪的电梯“,嗯,好消息是写出来了……

晚上

题目:

 得出的答案代码:

#include <iostream>

#include <algorithm>

using namespace std;

int a,b,n,k[201],ans=999999999,flag,times[201],vis[201];

void dfs(int h,int step)
{
    if(h==b)
         ans=min(ans,step);//选出最小步数
    if(step>ans)  return;//一旦步数比当前的“最小步数”大,后面就不用继续运行了
    vis[h]=1;
    if(h+k[h]<=n&&vis[h+k[h]]==0)   dfs(h+k[h],step+1);//满足位置条件即可
    if(h-k[h]>=1&&vis[h-k[h]]==0)   dfs(h-k[h],step+1);//同上
    vis[h]=0;//使用回溯
}
int main()
{
    cin >>n>>a>>b;
    for(int i=1;i<=n;i++)
        cin >>k[i];
    dfs(a,0);
    if(ans==999999999)//这代表ans未更改值,说明达不到这个位置
        cout << -1;
    else
        cout << ans;
    return 0;
}

一个典型且”简单“的dfs兼回溯的问题,写出来之后开始怀疑自己为啥写了那么久……其实我写的还要长一些,我最后写的得了80,还有两个测试答案错误……想了一会儿就去看题解了……然后发现这也太……只能说编程这东西到底还是十分精妙,一些巧妙的想法(就是一些精巧的语句),真的是对一个程序的改变太大了……

要加油,我也会有精妙的想法的。

好像下午期间又尝试写了写那个考试周复习的那玩意,嗯,没写出来……

明日继续奥里给!!!

明日计划

一定写出”P2392 kkksc03考前临时抱佛脚“

继续听听力,等等,今天好像忘了背单词……

争取明天写出3道题,奥里给!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值