• codeforces 724B Batch Sort(暴力-列交换一次每行交换一次)


    题目链接:http://codeforces.com/problemset/problem/724/B

    题目大意:

      给出N*M矩阵,对于该矩阵有两种操作:

      (保证,每行输入的数是 1-m 之间的数且不重复)

      1.交换两列,对于整个矩阵只能操作一次

      2.每行交换两个数。

      交换后是否可以使每行都是1-m 数字递增。

    解题思路:

      1.得到矩阵后先判断,是否每行可以交换两个数可以得到递增的矩阵,如果可以则输出“YES”.

      2.暴力交换两列,交换两列后,判断每行是否可以交换两个数得到递增的矩阵,如果可以则输出“YES”.

        [注意:如果交换之后不可得到递增的矩阵,要记得将交换后的两列交换回来]

    AC Code:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int N=22;
     5 int na[N][N];
     6 int n,m;
     7 
     8 int judge(int na[N][N])
     9 {
    10     for(int i=1; i<=n; i++)
    11     {
    12         int cut=0;
    13         for(int j=1; j<=m; j++)
    14             if(na[i][j]!=j)cut++;
    15         if(cut>2)return 0;
    16     }
    17     return 1;
    18 }
    19 int main()
    20 {
    21     while(scanf("%d%d",&n,&m)!=EOF)
    22     {
    23         for(int i=1; i<=n; i++)
    24             for(int j=1; j<=m; j++)
    25                 scanf("%d",&na[i][j]);
    26         if(judge(na))
    27         {
    28             printf("YES
    ");
    29             continue;
    30         }
    31         int flag=0;
    32         for(int i=1; i<=m; i++)
    33         {
    34             if(flag)break;
    35             for(int j=i+1; j<=m; j++)
    36             {
    37                 if(flag)break;
    38                 for(int x=1; x<=n; x++)swap(na[x][i],na[x][j]);
    39                 if(judge(na))flag=1;
    40                 for(int x=1; x<=n; x++)swap(na[x][i],na[x][j]);
    41             }
    42         }
    43         printf("%s
    ",flag?"YES":"NO");
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    浅谈异或相关性质
    重谈树状数组
    洛谷 U141397 !
    谈谈Sleep和wait的区别
    请描述线程的生命周期
    一个普通main方法的执行,是单线程模式还是多线程模式?为什么?
    创建线程的方式
    一道关于try catch finally返回值的问题
    throw跟throws的区别
    罗列常见的5个非运行时异常
  • 原文地址:https://www.cnblogs.com/A--Q/p/5965340.html
Copyright © 2020-2023  润新知