当前位置:   article > 正文

D - Swapping Puzzle (交换i和i+1行或者i和i+1列使得a矩阵和b矩阵相同,用next_permutation函数和逆序对)

swapping puzzle

题目:https://atcoder.jp/contests/abc332/tasks/abc332_d

思想:首先交换行对列中的元素无影响,同理交换列对行的元素无影响。

我们用暴力枚举(两层next_premutation函数)来找到所有的排列方式,同时判断这种排列方式是否a矩阵与b矩阵相同,初始行数组和列数组是1-n,1-m,全排列之后,如果相同,用逆序对同时记录行变化了多少以及列变化了多少,并且不断更新最小的交换次数。

代码:

  1. // Problem: D - Swapping Puzzle
  2. // Contest: AtCoder - AtCoder Beginner Contest 332
  3. // URL: https://atcoder.jp/contests/abc332/tasks/abc332_d
  4. // Memory Limit: 1024 MB
  5. // Time Limit: 2000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8. #include<bits/stdc++.h>
  9. using namespace std;
  10. typedef long long ll;
  11. const int N = 10;
  12. const int inf = 0x3f3f3f3f;
  13. int n,m;
  14. int a[N][N],b[N][N];
  15. int row[N],col[N];
  16. int main(){
  17. ios::sync_with_stdio(false);
  18. cin.tie(0),cout.tie(0);
  19. cin>>n>>m;
  20. for(int i=1;i<=n;i++){
  21. for(int j=1;j<=m;j++){
  22. cin>>a[i][j];
  23. }
  24. }
  25. for(int i=1;i<=n;i++){
  26. for(int j=1;j<=m;j++){
  27. cin>>b[i][j];
  28. }
  29. }
  30. for(int i=1;i<=n;i++){
  31. row[i]=i;
  32. }
  33. for(int i=1;i<=m;i++){
  34. col[i]=i;
  35. }
  36. int res=inf;
  37. do{
  38. do{
  39. int flag=1;
  40. for(int i=1;i<=n;i++){
  41. for(int j=1;j<=m;j++){
  42. if(a[row[i]][col[j]]!=b[i][j]){ //判断是否相同
  43. flag=0;
  44. }
  45. }
  46. }
  47. if(flag){
  48. int ans=0;
  49. for(int i=1;i<=n;i++){
  50. for(int j=i+1;j<=n;j++){
  51. if(row[i]>row[j]){
  52. ans++;
  53. }
  54. }
  55. }
  56. for(int i=1;i<=m;i++){
  57. for(int j=i+1;j<=m;j++){
  58. if(col[i]>col[j]){
  59. ans++;
  60. }
  61. }
  62. }
  63. res=min(res,ans);
  64. }
  65. }while(next_permutation(row+1,row+n+1));
  66. }while(next_permutation(col+1,col+m+1));
  67. if(res==inf) res=-1;
  68. cout<<res<<"\n";
  69. return 0;
  70. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/306084
推荐阅读
相关标签
  

闽ICP备14008679号