写在前面
虽然比赛我打的很菜,很拉跨,但是这周我真的没有摸鱼,这时候我就想起一句名言,学了就一定会吗?会了就能把题做对吗?我是废物,我是傻逼(小声bb一下)
主要内容
1.写了一个有点意思的小······动画?(我也不知道叫啥)
2. 学习dfs和bfs
3. 打比赛······(折磨自己的比赛)
放烟花程序
由于这周脑子刚开始心血来潮报了什么。。。叫啥来着。。《西邮计算机设计大赛》,但是直到现在我都不知道那个东西给谁交,不说这个说一下代码。其实可视化程序反正视频里面那个人这么叫 的定义和我日常学习的算法编程是有相通的比如有这么一段代码
IMAGE shootimg;
loadimage(&shootimg, L"shoot.jpg", 200, 50);
putimage(0, 0, &shootimg);
我很懵逼,这是啥?但其实也就是定义一个图片变量,读取这个图片输出这个图片他的效果就和
int a;
scanf("%d",&a);
printf("%d",a);
的效果一样,只不过就是把int变量变成了IMAGE变量;
思考一个烟花升空的过程无非就是三步,发射,上升,炸。
先写第一步发射,首先你需要有一个图片
这就是那个烟花弹,但是每次只能发射一颗,所以先做的就是定义一个发射烟花弹的结构体
struct Jet
{
int x, y; //当前坐标
int hx, hy; //最高点坐标
int height; //最高点的坐标 当前坐标 高度
bool shoot;
DWORD t1, t2, dt;//时间间隔控制速度
IMAGE img[2];//图片
byte n : 1;
}jet[NUM]; //烟花弹的数组
To be honest 这里面最后一行那个byte是啥我也不知道。。。
但主要内容都注释上了 shoot 变量是用来判断烟花弹是否发射。
//初始化烟花弹
jet[i].x = 0;
jet[i].y = 0;
jet[i].dt = rand() % 10;
jet[i].height = 0;
jet[i].hx = 0;
jet[i].hy = 0;
jet[i].shoot = false;
jet[i].n = 0;
jet[i].t1 = GetTickCount();//获取系统时间
然后在那个图片里面选择发射的烟花弹
IMAGE shootimg;
loadimage(&shootimg, L"shoot.jpg", 200, 50);
//putimage(0, 0, &shootimg);
//拆开 13个烟花弹 随机选取颜色
for (int i = 0; i < NUM; i++)
{
int n = rand() % 5;
//工作区 输出->窗口(工作区)
SetWorkingImage(&shootimg);
getimage(&jet[i].img[0], n * 20, 0, 20, 50);
getimage(&jet[i].img[1], (n+5)*20, 0, 20, 50);//获取shootimg图片的图片img[]
}
SetWorkingImage(NULL); //工作区回到窗口上
}
//选择烟花弹 1.还没有发射 2.不能同时往上走
void Choice(DWORD &t1)
{
DWORD t2 = GetTickCount();
if (t2 - t1 > 100)
{
int n = rand() % NUM;
if (jet[n].shoot == false && fire[n].show == false)
{
//重置烟花弹数据 真正想要的数据
jet[n].x = rand() % 1200;
jet[n].y = rand() % 100 +600;
jet[n].hx = jet[n].x;
jet[n].hy = rand() % 400;
//jet[n].height = jet[n].y - jet[n].hy;
jet[n].shoot = true;
putimage(jet[n].x, jet[n].y, &jet[n].img[0], SRCINVERT);
}
t1 = t2;
}
}
出了点问题,,现在写到这儿,下周再写后续所有部分。。
dfs和bfs
这个两个算法真的是学了不一定会,会了不一定对。。。可能因为我太肉了吧,
先说dfs
dfs全名深度优先搜索,这种搜索方法在我看来就是硬搜,啥都不管,就是硬搜,搜索时间全看运气,运气好的话第一次搜到低就能搜到,不好的话就。。。。啊哈算法里面用放纸牌先来解释深搜,可我感觉后面的迷宫更形象一点
可以清楚的看到昂,这个深度搜索搜的是如此1之乱,如此之没有规律我还没画完,但是深度搜索自然有其优点,一般情况下,深度优先搜索法占内存少但速度较慢,广度优先搜索算法占内存多但速度较快,在距离和深度成正比的情况下能较快地求出最优解 。虽然这个我现在还是不懂这两个的深层次的差别,但是个人更喜欢广搜,毕竟理解起来好理解
下面画一下bfs的图
可以看出来bfs就清晰了许多
说两道例题吧
洛谷P1135 奇怪的电梯
题目描述如下
先用dfs做,这里要感谢组长送来的建议让我成功的过了这道题
#include <stdio.h>
int k[300],book[300],flag=0,a,b,n,min=9999999;
void dfs(int a,int step)
{
//判断边界条件
if(a==b)
{
flag=1;
if(min>step)
{
min=step;
}
return;
}
else if(step>min)
{
return;
}
//尝试每种可能
int s[2]={1,-1},i,next;
for(i=0;i<2;i++)
{
if(s[i]==1)
{
next=a+k[a];
}
else
{
next=a-k[a];
}
if(next>n||next<1)
{
continue;
}
if(book[next]==0)
{
book[next]=1;
dfs(next,step+1);
book[next]=0;
}
}
return;
}
int main()
{
int i;
scanf("%d%d%d",&n,&a,&b);
for(i=1;i<=n;i++)
{
scanf("%d",&k[i]);
}
dfs(a,0);
if(flag==1)
{
printf("%d",min);
}
else
{
printf("-1");
}
return 0;
}
说起来dfs我挺喜欢啊哈算法里面的格式的
//判断边界条件
//列举每种可能
只要在做题时理清这两部分就能把题做过去
这道题用dfs的话还有一个注意的点,那就是要再加一个判断
else if(step>min)
{
return;
}
如果不加这一句的话会超时
下面是用bfs的代码
#include <stdio.h>
typedef struct D{
int next;
int step;
}d;
int main()
{
d cen[300];
int head,tail,a[300]={0},book[300]={0},n,i,startx,endx,flag;
scanf("%d%d%d",&n,&startx,&endx);
flag=0;
head=1;
tail=1;
book[startx]=1;
cen[tail].next=startx;
cen[tail].step=0;
tail++;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
while(head<tail)
{
if(cen[tail-1].next==endx)
{
flag=1;
break;
}
if(cen[head].next+a[cen[head].next]<=n&&!book[cen[head].next+a[cen[head].next]])
{
book[cen[head].next+a[cen[head].next]]=1;
cen[tail].next=cen[head].next+a[cen[head].next];
cen[tail].step=cen[head].step+1;
tail++;
}
if(cen[tail-1].next==endx)
{
flag=1;
break;
}
if(cen[head].next-a[cen[head].next]>=1&&!book[cen[head].next-a[cen[head].next]])
{
book[cen[head].next-a[cen[head].next]]=1;
cen[tail].next=cen[head].next-a[cen[head].next];
cen[tail].step=cen[head].step+1;
tail++;
}
if(cen[tail-1].next==endx)
{
flag=1;
break;
}
head++;
}
if(flag==1)
printf("%d",cen[tail-1].step);
else
printf("-1");
return 0;
}
就只需要判断往上还是往下走就行,最终到楼层了直接停止循环,不需要像dfs那样一直判断到所有情况都结束
这周的比赛
这周的比赛真的把我心态干崩了,有一种你做的每一道题都是高考压轴题的无奈感,全部不会,就是在哪硬做,唉,清楚的认清了现实,下周继续加油吧。
下周安排
把剩下的几个比塞题能做的一做,然后就要开始期末复习了,组长,这代码是不是可以停一停(手动滑稽)