Lake Counting S
题目描述
由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 N\times M(1\leq N\leq 100, 1\leq M\leq 100)N×M(1≤N≤100,1≤M≤100) 的网格图表示。每个网格中有水(W
) 或是旱地(.
)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。
输入第 11 行:两个空格隔开的整数:NN 和 MM。
第 22 行到第 N+1N+1 行:每行 MM 个字符,每个字符是 W
或 .
,它们表示网格图中的一排。字符之间没有空格。
输出一行,表示水坑的数量。
题解:
1:寻找周围八个方格是否有水
2:然后我们把搜索到的用‘ . ’覆盖掉,这样被算进一个水坑的W就不会重复计算。
代码
#include<stdio.h>
int a,b,count=0;
char c[1000][1000];
void dfs(int x,int y)
{c[x][y]='.';
int s[8][2]={0,1,0,-1,1,0,-1,0,1,1,-1,-1,1,-1,-1,1};//八个方向
for(int i=0;i<8;i++)
{
if(c[x+s[i][0]][y+s[i][1]]=='W'&&x+s[i][0]>=0&&x+s[i][0]<a&&y+s[i][1]>=0&&y+s[i][1]<b)//是否越界
{
dfs(x+s[i][0],y+s[i][1]);
}
}
}
int main()
{
scanf("%d%d",&a,&b);
for(int i=0;i<a;i++)
{
scanf("%s",c[i]);
}
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
if(c[i][j]=='W')//寻找周围的水
{
dfs(i,j);
count++;
}
}
}
printf("%d",count);
}
二:小兔子的果园
题目描述
小兔子有n个果园,果园里有许多果树,有苹果树,芒果树,香蕉树,李子树,无花果树。
终于到了丰收的季节,小兔子从每个果园采了许多的水果,现在小兔子想给每个果园的产量排序。
因为小兔子爱吃芒果,所以按芒果的数量从大到小排序,如果芒果的数量相同,那就按照其他水果的总数量从小到大排序。
不会存在芒果数量相同且其他水果的总数量相同的情况。
输入
第一行输入一个n,代表n个果园(1<=n<=10)
接下来n行,每行五个数,分别代表小兔子从果园里采摘的苹果数量,芒果数量,香蕉数量,李子数量,无花果数量
每个水果的数量不超过10,且没有负数。
输出
输出n个果园产量排序后的结果
题解:
1:利用结构体把每种水果记录下
2:把芒果的数量进行比较
3:相同的话总和比较
代码
#include<stdio.h>
struct fun
{
int a,b,c,d,e;
} ;
int main()
{struct fun s[10];
struct fun t[10];
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d %d %d %d %d",&s[i].a,&s[i].b,&s[i].c,&s[i].d,&s[i].e);//输入
}
for(int i=0; i<n-1; i++)
{
for(int j=0; j<n-i-1; j++)
{
if(s[j].b<s[j+1].b) //芒果的数量比较
{
t[j]=s[j];
s[j]=s[j+1];
s[j+1]=t[j];
}
if(s[j].b==s[j+1].b) //相同情况
{
if(s[j].a+s[j].c+s[j].d+s[j].e>s[j+1].a+s[j+1].c+s[j+1].d+s[j+1].e)
{
t[j]=s[j];
s[j]=s[j+1];
s[j+1]=t[j];
}
}
}
}
for(int i=0; i<n; i++)
{
printf("%d %d %d %d %d",s[i].a,s[i].b,s[i].c,s[i].d,s[i].e);
printf("\n");
}
}
知识点:
模板情况:
0-1背包:外循环nums,内循环target,target倒序,target>=nums[i]
完全背包:外循环nums,内循环target,target正序,target>=nums[i]
组合背包:外循环nums,内循环target,target正序,target>=nums[i]
分组背包:外循环背包数bags,内循环两层根据题目转换成以上三种背包类型
问题情况:
最值问题:dp[i] = max/min(dp[i],dp[i - nums[i]] + 1)或dp[i] = max/min(dp[i],dp[i - nums[i]] + nums[i]);
存在问题:dp[i] = dp[i] || dp[i-nums[i]]
组合问题:dp[i] += dp[i-nums[i]]