正文

岛上的植物(湖南省第二届大学生程序设计大赛)2007-08-19 10:40:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/28650.html

分享到:

岛上的植物
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
Total submit users: 31, Accepted users: 26
Problem 10844 : No special judgement
Problem description
测绘人员将卫星拍摄的地面遥感图像转换成了数值方阵。方阵中的每个元素都是正整数,代表某单位面积土地上的植物类型。元素为质数时对应土地上的植物为稀有类型,元素为合数时对应土地上的植物为常见类型。为保护稀有植物,林业局雇佣你编写程序分析上述数值方阵,从中检测出稀有植物区和非稀有植物区。划分区域的原则是:如果数值方阵中的两个元素同为质数或同为合数,而且它们共行相邻或共列相邻,则这两个元素同属一个区域。

Input
输入文件中包含若干待分析的数值方阵。方阵的每一行占据文件的每一行,同一行的方阵元素之间用空格分隔。每个数值方阵的前一行包含且仅包含一个正整数,代表该方阵的行数。文件的结尾行包含且仅包含一个负整数。数值方阵的行数不会超过100,元素的值不会大于100000000。

Output
针对输入文件中的每一个数值方阵分别输出如下信息: 1 该数值方阵的序号(按照其在输入文件中的位置从1计起)。格式是:“Area n:” (n代表方阵序号) 2 稀有植物区域的数目和每个稀有植物区域的面积(按升序排列)。格式是: “M unique vegetation regions: a1 a2 ...” (M为区域数目,a1, a2,...等代表每个区域的面积) 3 非稀有植物区域的数目。格式是:“K non-unique vegetation regions” (K为区域数目) 具体的输出格式请参考示例。

Sample Input
3
2  4 9
17 6 37
29 8 11
4
2 3 12 15
5 7 21 33
4 6 11 17
8 9 13 29
-1
Sample Output
Area 1:
2 unique vegetation regions: 2 3 
1 non-unique vegetation regions
Area 2:
2 unique vegetation regions: 4 4
2 non-unique vegetation regions
Problem Source

湖南省第二届大学生程序设计大赛

////// 递归搜索题

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#define MAX 100
using namespace std;

bool isPrime(int a){
    if(a==1)
        return false;
    for(int i=2; i<=sqrt(a); i++){    
        if(!(a%i))
            return false;
    }
    return true;
}

int myCmp(const void *a, const void *b){
    if(*(int*)a > *(int*)b)
        return -1;
    else if(*(int*)a < *(int*)b)
        return 1;
    return 0;
}

int get(char a[][MAX],int i,int j,int n){
    int k=a[i][j],sum=0;
    a[i][j] = 0;
    if(a[i-1][j] && i>0 && k==a[i-1][j])
        sum += get(a,i-1,j,n);
    if(a[i+1][j] && i<n-1 && k==a[i+1][j])
        sum += get(a,i+1,j,n);
    if(a[i][j-1] && j>0 && k==a[i][j-1])
        sum += get(a,i,j-1,n);
    if(a[i][j+1] && j<n-1 && k==a[i][j+1])
        sum += get(a,i,j+1,n);
    return sum+1;
}

int main() { 
    char a[MAX][MAX]={0};
    int test=1;
    vector<int> v;
    while(1){
        int n,i,j,k;
        cin>>n;
        if(n==-1)
            break;
        for(i=0; i<n; i++){
            for(j=0; j<n; j++){
                cin>>k;
                if(isPrime(k))
                    a[i][j]=1;
                else
                    a[i][j]=2;
            }
        }    
        for(k=i=0; i<n; i++){
            for(j=0; j<n; j++)
                if(a[i][j]>0){
                    if(a[i][j]==1)
                        v.push_back(get(a,i,j,n));
                    else{
                        get(a,i,j,n);
                        k++;
                    }
                }
        }
        cout<<"Area "<<test++<<":"<<endl;
        cout<<v.size()<<" unique vegetation regions:";
        sort(v.begin(),v.end());
        for(i=0; i<v.size(); i++)
            cout<<" "<<v[i];
        cout<<endl<<k<<" non-unique vegetation regions"<<endl;
        v.clear();
    }
    return 0; 
} 

阅读(3507) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册