第一次CSP模拟总结

题目三:可怕的宇宙射线
宇宙射线会在无限的二维平面上传播(可以看做一个二维网络图),初始方向默认向上,宇宙射线会在发射一段距离后分裂,向该方向的左右45度方向分裂出两条宇宙射线,同时威力不变!宇宙射线会分裂n次,每次分裂后会在分裂方向前进ai个单位长度。要求计算出共有多少个位置会被打击;
输入描述:
输入第一行包含一个正整数n(n<=30),表示宇宙射线会分裂n次
输入第二行包含n个正整数a1,a2…an,第i个数ai(ai<=5)表示第i次分裂的宇宙射线会在它原方向上继续走多少个单位长度。
输出描述:
输出一个数ans,表示会有多少个位置会被打击;
样例输入:
4
4 2 2 3
样例输出:
39
题目分析:可以首先感觉到,宇宙射线一直在做着重复的事情,并且是一分为二,则在做题目时应当直接反应出利用dfs递归深度搜索即可,当然,利用bfs也可以处理,但是感觉bfs要维护与注意的东西比较多。对于这种dfs递归深搜和一棵二叉树从根遍历一个感觉,主要体会其中的一分为几的分叉思想。当然,简单的dfs深搜肯定是要超时的,因为搜索次数是指数级增长的,但题目中明确提到每次走的距离不超过5,这也就限定了射线所波及到的范围,所以我们可以利用记忆化搜索排查已经做过的工作,在这里我们要利用数组进行记忆,在考试时自己利用了map,但是map是需要维护结构的,故其肯定会造成时间上的浪费。在这里,我们应当认识到,对于记忆化的东西,我们大多是依靠一个数组进行记忆的,这样操作和查询都很简单。同样,在这里我们应当明白,对于一个射线发射,其是由四元构成的。1,横坐标;2,纵坐标;3,方向;4,第几次移动;所以我们在进行记忆时,维护的应当是四维的一个量。另外,在下面的代码中,其中的分叉处理的不够好,造成了很大的冗余,对于此,分叉过程利用一个小循环处理比较好。因为八个方向围成了一个圈,对于圈这种结构,我们实现循环的做法大多是利用指定数组,并加上取模的运算实现。

#include<iostream>
#include<string.h>
using namespace std;
int ans=0;
int cc;
bool mp[310][310];
bool mp2[310][310][7][30];
void func(int x,int y,int* dis,int sty,int n) {
	if(n==cc) {
		return;
	}
	if(mp2[x][y][sty][n]==1)
	return;
	mp2[x][y][sty][n]=1;
	if(sty==0) {
		for(int i=1; i<=dis[n]; i++) {

			if(mp[x+i][y+i]==0) {
				ans++;
				mp[x+i][y+i]=1;
			}
			if(mp[x-i][y+i]==0) {
				ans++;
				mp[x-i][y+i]=1;
			}
		}
		func(x+dis[n],y+dis[n],dis,1,n+1);
		func(x-dis[n],y+dis[n],dis,7,n+1);
	} else if(sty==1) {
		for(int i=1; i<=dis[n]; i++) {

			if(mp[x][y+i]==0) {
				ans++;
				mp[x][y+i]=1;
			}
			if(mp[x+i][y]==0) {
				ans++;
				mp[x+i][y]=1;
			}
		}
		func(x,y+dis[n],dis,0,n+1);
		func(x+dis[n],y,dis,2,n+1);
	} else if(sty==2) {
		for(int i=1; i<=dis[n]; i++) {

			if(mp[x+i][y+i]==0) {
				ans++;
				mp[x+i][y+i]=1;
			}
			if(mp[x+i][y-i]==0) {
				ans++;
				mp[x+i][y-i]=1;
			}
		}
		func(x+dis[n],y+dis[n],dis,1,n+1);
		func(x+dis[n],y-dis[n],dis,3,n+1);
	} else if(sty==3) {
		for(int i=1; i<=dis[n]; i++) {

			if(mp[x+i][y]==0) {
				ans++;
			    mp[x+i][y]=1;
			}
			if(mp[x][y-i]==0) {
				ans++;
				mp[x][y-i]=1;
			}
		}
		func(x+dis[n],y,dis,2,n+1);
		func(x,y-dis[n],dis,4,n+1);
	} else if(sty==4) {
		for(int i=1; i<=dis[n]; i++) {

			if(mp[x-i][y-i]==0) {
				ans++;
				mp[x-i][y-i]=1;
			}
			if(mp[x+i][y-i]==0) {
				ans++;
				mp[x+i][y-i]=1;
			}
		}
		func(x+dis[n],y-dis[n],dis,3,n+1);
		func(x-dis[n],y-dis[n],dis,5,n+1);
	} else if(sty==5) {
		for(int i=1; i<=dis[n]; i++) {

			if(mp[x-i][y]==0) {
				ans++;
				mp[x-i][y]=1;
			}
			if(mp[x][y-i]==0) {
				ans++;
				mp[x][y-i]=1;
			}
		}
		func(x-dis[n],y,dis,6,n+1);
		func(x,y-dis[n],dis,4,n+1);
	} else if(sty==6) {
		for(int i=1; i<=dis[n]; i++) {

			if(mp[x-i][y-i]==0) {
				ans++;
				mp[x-i][y-i]=1;
			}
			if(mp[x-i][y+i]==0) {
				ans++;
				mp[x-i][y+i]=1;
			}
		}
		func(x-dis[n],y-dis[n],dis,5,n+1);
		func(x-dis[n],y+dis[n],dis,7,n+1);
	} else if(sty==7) {
		for(int i=1; i<=dis[n]; i++) {

			if(mp[x-i][y]==0) {
				ans++;
				mp[x-i][y]=1;
			}
			if(mp[x][y+i]==0) {
				ans++;
				mp[x][y+i]=1;
			}
		}
		func(x-dis[n],y,dis,6,n+1);
		func(x,y+dis[n],dis,0,n+1);
	}
}
int main() {
	memset(mp,0,sizeof(mp));
	memset(mp2,0,sizeof(mp2));
	cin>>cc;
	int* dis=new int[cc];
	for(int i=0; i<cc; i++) {
		cin>>dis[i];
	}
	for(int i=0; i<dis[0]; i++) {
		mp[150][150+i]=1;
		ans++;
	}
	func(150,150+dis[0]-1,dis,0,1);
	cout<<ans<<endl;
}在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值