思路:枚举水坑搜索起点(符合标准的为W且没有被搜索过)找到合法起点进行广搜,广搜几次就有几个水坑(sum=0;),bool函数flase or ture.最后输出sum即可。接下来就是写广搜的程序,
1.先输入所有W和.
2.定义一个起点,把起点标记为已搜索过ture.只要不超过全网格的范围进行下一步,循环广搜,关于W周围八个点的坐标与W的关系,定义一个数组来计算周围各点的坐标.(d[8][2]). 拓展点坐标出来之后,下一步判断这些点是否满足条件(是否出界,是否为W,是否为搜索过的点,什么时候结束),
二.最大子段和.
动态规划,如果加上下一个元素值比不加当前元素值还小,就和当前的最大值进行比较,然后从下一元素进行新的动态规划,
以下代码还有错误;不能过;
#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
int n;
int a[1000];
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d",&a[i]);}
int sum=0;
int ans=-1e9;
for(int i=1;i<n;i++){
sum=(sum+a[i]>a[i])?sum+a[i]:a[i];
if(sum>ans) ans=sum;
}
printf("%d",ans);
return 0;
}
三.
题目描述
给定一个递推式a[i]=a[i-1]/2(i>1,向下取整),并且给定a[1],要求你按照从小到大的顺序输出所有的a[i](a[i]!=0)
思路:利用递归函数的思想,简单的逆序输出;
#include<stdio.h>
int fanxu(long long int x){
if(x==0)
return 0;
else {
fanxu(x/2);
}
printf("%lld ",x);
}
int main(){
long long int a,p;
while(~scanf("%lld",&a)){
fanxu(a);
printf("\n");
}
}
四.
题目描述
给定一组整数 l 和 r,(1 <= l <= r <= 100000), 再给定一个整数 t (0 <= t <= 9),求 [l, r] 之间的数的十进制表示中会出现多少个 t。
思路:暴力解决
#include<stdio.h>
int main(){
int l,r,t,ans=0,m,n;
scanf("%d %d %d",&l,&r,&t);
for(int h=l;h<=r;h++){
m=h;
if(h<10){
if(h==t){
ans++;
}
}
else{
if(m>=10&&m<100){
n=1;
}
if(m>=100&&m<1000){
n=2;
}
if(m>=1000&&m<10000){
n=3;
}
if(m>=10000&&m<100000){
n=4;
}
if(m==100000){
n=5;
}
for(int j=0;j<=n;j++){
if(t==m%10){
ans++;}
m=m/10;
}
}
}
printf("%d",ans);
return 0;
}
五.
题目描述
给定一个长度为n的序列a,并且序列a中的元素只由1或0构成
你可以执行一种操作,选定序列a中的一个元素a[i],使得a[i]=1-a[i]
最后你可以得到一个x和一个y
x:序列a中连续1的最长序列长度
y:操作次数
要求你求出最大的x-y
思路:找到规律即可;
#include<stdio.h>
int main(){
int t,n;
int a[100000];
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d",&n);
for(int j=0;j<n;j++){
scanf("%d",&a[j]);
}
int ans=0;
for(int j=0;j<n;j++){
if(a[j]==0){
ans++;
}
}
printf("%d\n",n-ans);
}
return 0;
}