计算导论与C语言基础week10_2

5.异常细胞检测(简单)
描述

我们拍摄的一张CT照片用一个二维数组来存储,假设数组中的每个点代表一个细胞。每个细胞的颜色用0到255之间(包括0和255)的一个整数表示。我们定义一个细胞是异常细胞,如果这个细胞的颜色值比它上下左右4个细胞的颜色值都小50以上(包括50)。数组边缘上的细胞我们不检测。现在我们的任务是,给定一个存储CT照片的二维数组,写程序统计照片中异常细胞的数目。
输入

第一行包含一个整数N(100>=N>2).

下面有 N 行,每行有 N 个0~255之间的整数,整数之间用空格隔开。
输出

输出只有一行,包含一个整数,为异常细胞的数目。

#include <iostream>
using namespace std;

int main() 
{
    int n,i,j;
    cin >> n;
    int s[100][100];
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            cin >> s[i][j];
    int num = 0,a1,a2,a3,a4;//a1a2a3a4存差值,num存异常细胞数
    for (i = 1; i < n; i++) {  //从1开始
        for (j = 1; j < n; j++) {
            a1 = s[i - 1][j] - s[i][j];
            a2 = s[i + 1][j] - s[i][j];
            a3 = s[i][j - 1] - s[i][j];
            a4 = s[i][j + 1] - s[i][j];
            if (a1 >= 50 && a2 >= 50 && a3 >= 50 && a4 >= 50)num += 1;
        }
    }
    cout << num << endl;
    return 0;
}

6.循环移动(出错几次,但不难,稍微注意下)
描述
给定一组整数,要求利用数组把这组数保存起来,再利用指针实现对数组中的数循环移动。假定共有n个整数,则要使前面各数顺序向后移m个位置,并使最后m各数变为最前面的m各数。

注意,不要用先输出后m个数,再输出前n-m个数的方法实现,也不要用两个数组的方式实现。

要求只用一个数组的方式实现,一定要保证在输出结果时,输出的顺序和数组中数的顺序是一致的。

输入
输入有两行:第一行包含一个正整数n和一个正整数m,第二行包含n个正整数。每两个正整数中间用一个空格分开。

输出
输出有一行:经过循环移动后数组中整数的顺序依次输出,每两个整数之间用空格分隔。

#include <iostream>
using namespace std;

int main() 
{
    int n,m;
    int s[100];
    cin >> n>>m;
    int i, j, temp;
    for (i = 0; i < n; i++)cin >> s[i];

    for (i = 0; i < m; i++) {
        temp = s[n - 1];
        for (j = n-1; j >= 0 ; j--)//在这里出错几次,注意下循环后移从n-1开始,j--,从0开始会出错》。
            s[j + 1] = s[j];
        s[0] = temp;
    }

    for (i = 0; i < n; i++)cout << s[i]<<' ';
    cout << endl;
    return 0;
}

7.中位数(调试时候错了好几次,提交还错了2次,注意下)
给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)
输入

该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据包含的数据个数,1 <= N <= 15000.

接着N行为N个数据的输入,N=0时结束输入
输出

输出中位数,每一组测试数据输出一行

#include <iostream>
using namespace std;

int main() 
{   
    int n,pre,hou,num,i;
    int output;
    while (cin >> n && n != 0) {  //实现多组输入
        int s[15000] = { 0 };  //测试的时候把这个放到while外面导致出错,s[i]存i的个数
        for (i = 0; i < n; i++) {
            cin >> num;
            s[num]++;
        }//先存数
        int pos = n / 2 + 1;
//从前往后的n/2+1位加上从后往前的n/2+1位再除以2就是中位数,不论奇数个数还是偶数个数
        for (pre = 0, i = 0; pre < pos; i++) {
            pre += s[i];
        }
        int prenum = i;
        for (hou = 0, i = 14999; hou < pos; i--) {
            hou += s[i];
        }
        int hounum = i;
        cout << (prenum + hounum) / 2 << endl;
    }
    return 0;
}

浪费空间和时间..但是代码短,好写
其他实现到算法那里再看

8.校门外的树(有意思的题,不难)
描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入

输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出

输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

#include <iostream>
using namespace std;
//由于区域有重合,所以考虑用数组赋0或1来表示有树没树
int main() 
{
    int l, m;
    cin >> l >> m;
    int tree[10000] = { 0 };
    int i = 0,sta,fin;
    for (i = 0; i <= l; i++)
        tree[i] = 1;
    for (i = 0; i < m; i++) {
        cin >> sta >> fin;
        for (int j = sta; j <= fin; j++)
            tree[j] = 0;
    }
    int sum = 0;
    for (i = 0; i <= l; i++)
        if (tree[i])
            sum++;
    cout << sum << endl;
    return 0;
}

17.5.29,week10结束,剩个期末考了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值