zoukankan      html  css  js  c++  java
  • UPC新生赛—— 排序(思维)

    问题 O: 排序
    时间限制: 1 Sec 内存限制: 128 MB

    题目描述
    有N* M只奶牛,每只奶牛的头上都印有一个唯一的标识ID,第i头奶牛的ID是正整数i。农夫FJ有一块大农田,FJ把农田划分成N行M列的格子,每个格子都必须有且仅有一头奶牛在里面工作。由于奶牛是无序动物,所以它们随机的各自选取了一个格子就开始工作了。但FJ希望他的奶牛是有序的,FJ希望第1行的奶牛从左往右的ID依次是:1,2,3,…M;第二行的奶牛从左往右的ID依次是:M+1,M+2,M+3,…2*M;…最后一行的奶牛从左往右的ID一次是:(N-1)*M+1,(n-1)M+2,…NM。
    所以农夫FJ决定对奶牛进行排序。FJ只能对奶牛使用两种指令:
    任意交换两行奶牛。
    任意交换两列奶牛。
    上述的两种指令,FJ可以任用无限次。
    那么FJ可以达到目标吗?如果可以,输出“Possible”,否则输出“Impossible”。
    输入
    多组测试数据。
    第一行,一个整数R,表示总共有R组测试数据。 1<=R<=10。
    每组测试数据格式如下:
    第一行,两个整数:N和M。 1<=N,M<=50。
    接下来是N行M列的格子,第i行第j列是一个正整数,表示一开始在该格子工作的奶牛的ID。

    输出
    共R行,每行输出“Possible”,或者输出“Impossible”,双引号不用输出。
    样例输入 Copy
    5
    2 2
    1 2
    3 4
    2 2
    3 4
    1 2
    2 2
    4 3
    1 2
    1 10
    4 5 1 2 9 8 3 10 7 6
    3 5
    10 6 8 9 7
    5 1 3 4 2
    15 11 13 14 12
    样例输出 Copy
    Possible
    Possible
    Impossible
    Possible
    Possible

    题意:
    给定一个矩阵,问是否通过任意次交换两行或两列的得到题目所示的矩阵。
    思路:
    可以先对结果矩阵找规律,可以看出每一列%m都是相等的;把数轴上的点以m为分割点化成若干个区间,每一行的数都在同一个区间里,即/m是相等的。这样出现一个问题是每一行最后一个数和前面的数/m是不相等的。
    举个例子,比如1 2 3,n=3,那么/3得到的结果是0 0 1,但是我们想让他相等,这样比较好判断,就可以让每个数都-1,这样会发现变成了0 1 2,/ 3 后变成了0 0 0 ,符合题意。
    所以我们也就找到了能够使得题目条件成立的矩阵的特征。再来考虑做的变换,因为每次变换都是两行或两列的换,所以如果说原始的数组不满足特征的话,再怎么变换也不符合题意;如果满足特征的话,一定能够变换成符合题意的矩阵。
    代码:
    本题要理解二维数组的遍历。

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int r,n,m,i,j,t;
        int a[110][110];
        int b[110][110];
        int c[110][110];
        scanf("%d",&r);
        while(r--){
             
            int count=0;
            int flag=1;
             
             
            scanf("%d%d",&n,&m);
            for(i=1;i<=n;i++)
                for(j=1;j<=m;j++){
                    scanf("%d",&a[i][j]);
                    b[i][j]=a[i][j]%m;
                    c[i][j]=(a[i][j]-1)/m;
                }
                     
            for(i=1;i<=n;i++)
                for(j=i+1;j<=n;j++)
                    for(t=1;t<=m;t++)
                        if(b[i][t]!=b[j][t]){
                            flag=0;
                            break;
                        }
            for(i=1;i<=m;i++)
                for(j=1;j<=m;j++)
                    for(t=1;t<=n;t++)
                        if(c[t][i]!=c[t][j]){
                            flag=0;
                            break;
                        }   
            if(flag==1) printf("Possible
    ");
            else printf("Impossible
    ");
     
        }
        return 0;
    }
    
  • 相关阅读:
    如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    FileUpload拦截器
    aspnet网页刷新
    查看SQL表的详细信息
    学习GDI+ (1)
    设计模式简单工厂模式
    对数据库表操作,统一的方法。
    随机产生300道四则运算
    略谈从计算机专业,再到软件构建的初识
    #在android studio中维护日程管理系统
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853104.html
Copyright © 2011-2022 走看看