1. 程式人生 > >[Coursera 計算導論與C語言基礎] 第十週作業(下)

[Coursera 計算導論與C語言基礎] 第十週作業(下)

程式設計題#5:異常細胞檢測
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
我們拍攝的一張CT照片用一個二維陣列來儲存,假設陣列中的每個點代表一個細胞。每個細胞的顏色用0到255之間(包括0和255)的一個整數表示。我們定義一個細胞是異常細胞,如果這個細胞的顏色值比它上下左右4個細胞的顏色值都小50以上(包括50)。陣列邊緣上的細胞我們不檢測。現在我們的任務是,給定一個儲存CT照片的二維陣列,寫程式統計照片中異常細胞的數目。
輸入
第一行包含一個整數N(100>=N>2).
下面有 N 行,每行有 N 個0~255之間的整數,整數之間用空格隔開。
輸出
輸出只有一行,包含一個整數,為異常細胞的數目。

//程式設計題#5:異常細胞檢測
#include <iostream>
using namespace std;
int main()
{
	int n = 0;
	cin >> n;
	int count = 0;  //記錄異常細胞個數
	int matrix[100][100] = {0};
	for (int i = 0; i < n; i++)		//將數值記錄進二維陣列
		for (int j = 0; j < n; j++)
		{
		cin >> matrix[i][j];
		}
	for (int i = 1; i < n - 1; i++) //遍歷陣列,與上下左右比較
		for (int j = 1;j<n-1;j++)
	{
		if ((matrix[i - 1][j] - matrix[i][j]) >= 50 && (matrix[i + 1][j] - matrix[i][j]) >= 50
			&& (matrix[i][j - 1] - matrix[i][j]) >= 50 && (matrix[i][j + 1] - matrix[i][j]) >= 50)
		{
			count++;
		}
	}
	cout << count<< endl;	
	return 0;
}

程式設計題#6:迴圈移動
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
給定一組整數,要求利用陣列把這組數儲存起來,再利用實現對陣列中的數迴圈移動。假定共有n個整數,則要使前面各數順序向後移m個位置,並使最後m各數變為最前面的m各數。
注意,不要用先輸出後m個數,再輸出前n-m個數的方法實現,也不要用兩個陣列的方式實現。
要求只用一個數組的方式實現,一定要保證在輸出結果時,輸出的順序和陣列中數的順序是一致的。
輸入
輸入有兩行:第一行包含一個正整數n和一個正整數m,第二行包含n個正整數。每兩個正整數中間用一個空格分開。
輸出

輸出有一行:經過迴圈移動後陣列中整數的順序依次輸出,每兩個整數之間用空格分隔。

這題自己沒想出來,要回頭看。參考答案兩種:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n = 0, m = 0;
    cin >> n >> m;
    vector<int> samle(n);
    for (int i = 0; i < n; i++)
    {
        cin >> samle[i];
    }

    for (int i = 0; i < m; i++)
    {
        int temp = samle[n-1];
        for (int j = 0; j < n-1; j++)
        {
            samle[n-1-j] = samle[n-j-2];
        }
        samle[0] = temp;
    }
    for (int i = 0; i < n; i++)
    {
        if (i != n-1)
        {
            cout << samle[i] << " ";
        }
        else
        {
            cout << samle[i] << endl;
        }
    }
    return 0;
}
#include<iostream>  
using namespace std;  
int main() {  
    int n, m;  
    cin >> n >> m;  
    int number[500];  
    for (int i = 0; i < n; i++) {  
        cin >> number[i];  
    }  
    for (int i = 0; i < m; i++) {  
        int temp = number[0];  
        int temp1 = number[1];  
        int temp2 = number[n - 1];  
        for (int j = 1; j < n; ) {  
            temp1 = number[j];  
            number[j] = temp;  
            temp = temp1;  
            j++;  
        }  
        number[0] = temp2;  
    }  
for (int i = 0; i < n; i++) {  
    if (i != n - 1)  
        cout << number[i] << ' ';  
    else  
        cout << number[i] << endl;  
}  
    return 0;  
}  

程式設計題#7:中位數
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 2000ms 記憶體限制: 65536kB
描述
中位數定義:一組資料按從小到大的順序依次排列,處在中間位置的一個數或最中間兩個資料的平均值(如果這組數的個數為奇數,則中位數為位於中間位置的那個數;如果這組數的個數為偶數,則中位數是位於中間位置的兩個數的平均值).
給出一組無序整數,求出中位數,如果求最中間兩個數的平均數,向下取整即可(不需要使用浮點數)
輸入
該程式包含多組測試資料,每一組測試資料的第一行為N,代表該組測試資料包含的資料個數,1 <= N <= 15000.
接著N行為N個數據的輸入,N=0時結束輸入
輸出
輸出中位數,每一組測試資料輸出一行

//程式設計題#7:中位數
//先排序再求中位數
#include <iostream>
using namespace std;
int main()
{
	int n = 0;
	
	int a[15000] = { 0 };
	int middle = 0;
	while (1)      
	{
		cin >> n;
		if (n == 0) break; // n為0時,跳出while迴圈。
		//用陣列a記錄數值
		for (int i = 0; i < n ;i++)
		{
			cin >> a[i];
		}
		//給陣列排序,由小到大.
		for (int i = 0; i < n-1; i++)
			for (int j = i + 1; j < n;j++)
		{
			if (a[i] > a[j])
			{
				int change = a[i];
				a[i] = a[j];
				a[j] = change;
			}
		}
		if (n % 2 != 0) //n是奇數
		{
			middle = a[(n + 1) / 2-1];  //中位數則為中間的數
		}
		else   //n是偶數
		{
			middle = (a[n / 2 - 1] + a[n / 2])/2;  //中位數則為中間兩數的均值
		}
		cout << middle << endl;
	}

	return 0;
}
程式設計題#8:校門外的樹
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。
馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。
輸入
輸入的第一行有兩個整數L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的座標。
輸出

輸出包括一行,這一行只包含一個整數,表示馬路上剩餘的樹的數目。

我的答案,結果對,但系統不接受:

//程式設計題#8:校門外的樹

#include <iostream>
using namespace std;
//用陣列來表示,1表示有樹,0表示移除。
int main()
{
	int orginal[10001] = { 0 };//陣列orginal用來儲存原本有樹的區域
	int move[100][2] = { 0 };//二維陣列move用來儲存需區域的個數及其始末位置
	int l, m;
	l = m = 0;
	cin >> l >> m;
	int count = 0; 
	for (int i = 0; i < l+1; i++)  //如果l長度為3,那應該有4個結點,即應該有l+1個結點。
	{
		orginal[i] = 1;          //將原本有樹的位置置為1
	}
	for (int i = 0; i < m; i++)  //將資料寫進二維陣列move
	{
		cin >> move[i][0] >> move[i][1];
	}
	//開始移除
	for (int i = 0; i < m; i++)
		for (int j = move[i][0]; j <= move[i][1]; j++) //末端也需要移除,<=
		{
		orginal[j] = 0;
		}
	for (int i = 0; i < 10000; i++)
	{
		if (orginal[i]) count++;
	}
	cout << count << endl;
}
參考答案:
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int L = 0, M = 0;
    cin >> L >> M;
    vector<int> sample(L+1);
    for (int i = 0; i < L+1; i++)
    {
        sample[i] = 1;
    }
    for (int i = 0; i < M; i++)
    {
        int start = 0, end = 0;
        cin >> start >> end;
        for (int j = start; j <= end; j++)
        {
            sample[j] = 0;
        }
    }
    int num = 0;
    for (int i = 0; i < L+1; i++)
    {
        num += sample[i];
    }
    cout << num << endl;
    return 0;
}