每日总结22.12.26

今天学习了dfs搜索 

dfs的大致思路像一个树一样,先从某一个状态开始,然后向下解决,如果不成立则返回上一步然后再进行另一个状态。写了两道洛谷上的经典例题

1.题目https://www.luogu.com.cn/problem/P1162

大致题目就是一个n*n的方阵,然后全是由0和1组成,然后1可以围成一个圈,将圈内的数字全部变成2然后将整个方阵输出

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

这个题可以用bfs也可以用dfs我bfs不太熟练所以用的dfs

这个题的大致思路就是先从外圈开始判断,然后开始搜索,我写这题的时候定义了四个方向,然后就解决了,数据范围较小1<=n<=30,其实这个题用bfs比较快一些。而且这个题需要先从最外面的一圈的外面一圈开始判断,要不然就会把边缘给变成2

#include<stdio.h>
int s[32][32];
void f(int x,int y,int n)
{
	if(x>=0&&x<=n+1&&y>=0&&y<=n+1){
		if(s[x][y]==1||s[x][y]==3){
			return ;
		}
		else{
			s[x][y]=3;
			f(x-1,y,n);
			f(x+1,y,n);
			f(x,y+1,n);
			f(x,y-1,n);
		}
	}
}
int main()
{
	int n,i,j;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&s[i][j]);
		}
	}	
	f(0,0,n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(s[i][j]==3){
				s[i][j]=0;
			}
			else if(s[i][j]==0){
				s[i][j]=2;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%d ",s[i][j]);
		
		}
		printf("\n");
	}
return 0;
}

2.题目

题目大致就是现在有一种很美味的美食,现在做这个需要慎重选取材料现在有n种配料。

我们知道它们各自的酸度 ss 和苦度 bb。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的苦度为每一种配料的苦度的总和。

众所周知,美食应该做到口感适中,所以我们希望选取配料,以使得酸度和苦度的绝对差最小。

另外,我们必须添加至少一种配料,因为没有任何食物以水为配料的。

第一行一个整数 nn,表示可供选用的食材种类数。

接下来 nn 行,每行 22 个整数 s_isi​ 和 b_ibi​,表示第 ii 种食材的酸度和苦度。

输出格式

一行一个整数,表示可能的总酸度和总苦度的最小绝对值

输入

3 10

输出

7

输入

3 8

5 8

输出

1

输入

4

1 7

2 6

3 8

4 9

输出

1

大致思路就是bfs,这个题目比较简单一些,就只有两个方向然后直接写就好了

注意一个是乘积,一个是和,其中的min和abs函数我自己写了一下

#include<stdio.h>
int a[11],b[11],m=9999999;
int min(int x,int y)
{
	if(x<y){
		return x;
	}
	else{
		return y;
	}
}
int abs(int x,int y)
{
	if(x-y<0){
		return y-x;
	}
	else{
		return x-y;
	}
	
}
void f(int i,int x,int y,int n)
{
	while(i>n){
		if(x==1&&y==0){
			return ;
		}
		m=min(abs(x,y),m);
		return ;
	}
	f(i+1,x*a[i],y+b[i],n);
	f(i+1,x,y,n);
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i],&b[i]);
	}
	a[0]=1;
	b[0]=0;
	f(0,a[0],b[0],n);
	printf("%d\n",m);
	
	
return 0;
}

还有今天写了一个简单题

题目

小璐有一群笔友,有一天他们跟小璐约定好去互相寄邮件,每个人只能寄一封邮件,也只能收一封信,寄给这些笔友或者是小璐,小璐也要寄,当然了不能自己寄给自己,那么小璐想知道有多少种不同的寄邮件方式,对于这等问题,小璐早就知道了答案,所以他要来考考你,那么就交给你了。

输入

首先是一个t ,代表有t组测试数据

接下来每一组测试数据输入一个n代表小璐的笔友个数 ( 0 <  t  , n < 20 )

输出

输入每组测试数组的方案数

这个题的话就直接找规律就还好了,然后需要注意的是数据类型有点大需要使用long long型代码如下

#include<stdio.h>
int main()
{
	long long int n,i,t,x=0,y=0;
	scanf("%lld",&t);
	for(int i=0;i<t;i++){
		x=0;
		y=1;
		scanf("%lld",&n);
		for(int i=2;i<=n+1;i++){
			x=x*i+y;
			y=-y;
			
		}
		printf("%lld\n",x);
	}
	

return 0;
}

今天还看了郝斌老师关于数据类型的课,学习了链表的基本知识链表

链表是由头结点和首结点还有尾结点所组成的一个存储类型,中间由指针来来连接每个结点。

还有一些比较小的知识点和技巧就不阐述了以上就是今日的学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值