今天学习了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 种食材的酸度和苦度。
输出格式
一行一个整数,表示可能的总酸度和总苦度的最小绝对值
输入
1
3 10
输出
7
输入
2
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;
}
今天还看了郝斌老师关于数据类型的课,学习了链表的基本知识链表
链表是由头结点和首结点还有尾结点所组成的一个存储类型,中间由指针来来连接每个结点。
还有一些比较小的知识点和技巧就不阐述了以上就是今日的学习