C++的搜索题目(1)

问题A 奇特的分组:

题目描述

现有N个整数和一个整数M,小C想到一种有趣的组合方法,他想把连续的相加不大于M的整数分成一组,然后输出每一组的起始和终止编号,如果每组整数数量不同,在满足题意下保证分组尽可能少,若有多种分法,则保证并前面的小组整数个数少,后面的小组整数个数多。 

例如:1 3 4 6 2 5 7 七个整数, 

给定M=8,则输出为: 

1 - 3 

4 - 4 

5 - 6 

7 - 7

输入

第一行,两个整数n和m,n表示一共有n个整数,m表示给定的每组最大值。 n,m≤1000 

第二行,n个整数。 每个整数大小不超过m

输出

数行,每行一个范围。

样例输入
7 8
1 3 4 6 2 5 7
样例输出
1 - 3
4 - 4
5 - 6
7 - 7
提示

数据保证不存在0-0的情况。

解题
#include<bits/stdc++.h>
using namespace std;
int n,m,a[10001];
void f(int n){
    int sum=0;
    for(int i=n;i>=1;i--){
        if(sum+a[i]<=m){
            sum+=a[i];
            if(i==1){
                cout<<1<<" - "<<n<<endl;
                return ;
            }
        }
        else{
            f(i);
            cout<<i+1<<" - "<<n<<endl;
            return ;
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    f(n);
     
     
    return 0;
}

 问题B 汉诺塔问题:

题目描述

汉诺塔由三根柱子(分别用A、B、C表示)和n个大小互不相同的空心盘子组成。一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体。 

 对汉诺塔的一次合法的操作是指:从一根柱子的最上层拿一个盘子放到另一根柱子的最上层,同时要保证被移动的盘子一定放在比它更大的盘子上面(如果移动到空柱子上就不需要满足这个要求)。我们可以用两个字母来描述一次操作:第一个字母代表起始柱子,第二个字母代表目标柱子。例如,A-->B就是把柱子A最上面的那个盘子移到柱子B。汉诺塔的游戏目标是将所有的盘子从柱子A移动到柱子B或柱子C上面。 

 现在已知A柱子上有N个盘子,要把所有N个盘子移动到C柱子上,请输出每一次操作的具体步骤(N≤30) 

如两个盘子的情况:

A-->B 

A-->C 

B-->C

输入

一个数n,表示有n个圆盘。

输出

若干行表示具体操作过程

样例输入
2
样例输出
A-->B
A-->C
B-->C
解题 
#include<bits/stdc++.h>
using namespace std;
void hanoi(int n,char a,char b,char c){
    if(n==1){
        cout<<a<<"-->"<<c<<endl;
        return ;
    }
    hanoi(n-1,a,c,b);
    cout<<a<<"-->"<<c<<endl;
    hanoi(n-1,b,a,c);
    return ;
}
int main(){
    int n;
    cin>>n;
    hanoi(n, 'A','B','C');
     
     
     
    return 0;
}

问题C 水坑的数量:

题目描述

由于近期的降雨,雨水汇集在农民小F的田地不同的地方。

我们用一个 N×M(1≤N≤100,1≤M≤100) 的网格图表示。每个网格中有水( ) 或是旱地( )。

一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。

小F想弄清楚他的田地已经形成了多少水坑。给出小F田地的示意图,确定当中有多少水坑。

输入

输入第 1 行:两个空格隔开的整数:N 和 M。 

第 2 行到第 N+1 行:每行 M 个字符,每个字符是 W 或 .,它们表示网格图中的一排。字符之间没有空格。 

输出

输出一行,表示水坑的数量。

样例输入
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
样例输出
3
解题
#include<bits/stdc++.h>
using namespace std;
char a[1001][1001];
void find(int x,int y){
    a[x][y]='m';
    if(a[x+1][y]=='W') find(x+1,y);
    if(a[x-1][y]=='W') find(x-1,y);
    if(a[x][y+1]=='W') find(x,y+1);
    if(a[x][y-1]=='W') find(x,y-1);
    if(a[x+1][y+1]=='W') find(x+1,y+1);
    if(a[x-1][y-1]=='W') find(x-1,y-1);
    if(a[x-1][y+1]=='W') find(x-1,y+1);
    if(a[x+1][y-1]=='W') find(x+1,y-1);
    return;
}
int main(){
    int n,m,ans=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='W'){
                find(i,j);
                ans++;
            }
        }
    }   
    cout<<ans;
     
     
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值