上午
听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道题,奥里给!!!