废物的一周

写在前面

虽然比赛我打的很菜,很拉跨,但是这周我真的没有摸鱼,这时候我就想起一句名言,学了就一定会吗?会了就能把题做对吗?我是废物,我是傻逼(小声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那样一直判断到所有情况都结束

这周的比赛

这周的比赛真的把我心态干崩了,有一种你做的每一道题都是高考压轴题的无奈感,全部不会,就是在哪硬做,唉,清楚的认清了现实,下周继续加油吧。

下周安排

把剩下的几个比塞题能做的一做,然后就要开始期末复习了,组长,这代码是不是可以停一停(手动滑稽)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值