• CF 53D


    题意:

    给定两个数组,求由第一个数组到第二个数组的操作方法数 和 步骤(只能相邻间交换)

    暴力+模拟

    View Code
     1 /*
     2 
     3 */
     4 #include<stdio.h>
     5 #include<string.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<iostream>
     9 #include<queue>
    10 //#include<map>
    11 #include<math.h>
    12 using namespace std;
    13 typedef long long ll;
    14 //typedef __int64 int64;
    15 const int maxn = 305;
    16 const int inf = 0x7fffffff;
    17 const double pi=acos(-1.0);
    18 int a[ maxn ],b[ maxn ];
    19 int vis_b[ maxn ];
    20 struct node{
    21     int x,y;
    22 };
    23 queue<node>step[ maxn ];
    24 void init(){
    25     for( int i=0;i<maxn;i++ ){
    26         while( !step[ i ].empty() )
    27             step[ i ].pop();
    28     }
    29     memset( vis_b,0,sizeof( vis_b ) );
    30 }
    31 int main(){
    32     int n;
    33     while( scanf("%d",&n)!=EOF ){
    34         for( int i=0;i<n;i++ )
    35             scanf("%d",&a[ i ]);
    36         for( int i=0;i<n;i++ )
    37             scanf("%d",&b[ i ]);
    38         init();
    39         int cnt=0;
    40         node now;
    41         for( int i=0;i<n;i++ ){
    42             for( int j=0;j<n;j++ ){
    43                 if( vis_b[ j ]==0&&a[ i ]==b[ j ] ){
    44                     vis_b[ i ]=1;
    45                     if( i==j ){
    46                         //vis_b[ j ]=1;
    47                         break;
    48                     }
    49                     else if( i<j ){
    50                         //vis_b[ j ]=1;
    51                         now.x=j-1,now.y=j;
    52                         step[ cnt ].push( now );
    53                         swap( b[ now.x ],b[ now.y ] );
    54                         while( 1 ){
    55                             if( now.x==i ) break;
    56                             now.x--;
    57                             now.y--;
    58                             step[ cnt ].push( now );
    59                             swap( b[ now.x ],b[ now.y ] );
    60                         }
    61                         cnt++;
    62                         break;
    63                     }
    64                     else if( i>j ){
    65                         //vis_b[ j ]=1;
    66                         now.x=j,now.y=j+1;
    67                         step[ cnt ].push( now );
    68                         swap( b[ now.x ],b[ now.y ] );
    69                         while( 1 ){
    70                             if( now.y==i ) break;
    71                             now.x++;
    72                             now.y++;
    73                             step[ cnt ].push( now );
    74                             swap( b[ now.x ],b[ now.y ] );
    75                         }
    76                         cnt++;
    77                         break;
    78                     }
    79                 }
    80             }
    81         }
    82         int ans=0;
    83         for( int i=0;i<cnt;i++ )
    84             ans+=( step[ i ].size() );
    85         printf("%d\n",ans);
    86         for( int i=0;i<cnt;i++ ){
    87             while( !step[ i ].empty() ){
    88                 now=step[ i ].front();
    89                 printf("%d %d\n",1+now.x,1+now.y);
    90                 step[ i ].pop();
    91             } 
    92         }
    93     }
    94     return 0;
    95 }
    keep moving...
  • 相关阅读:
    constexpr函数"QAlgorithmsPrivate::qt_builtin_popcount"不会生成常数表达式
    Oracle 导出用户下的所有索引创建语句
    如何创建只读权限oracle账户
    CentOS7使用firewalld打开关闭防火墙与端口
    springboot异步线程(三)源码解析(二)
    springboot异步线程(三)源码解析(一)
    MethodInterceptor 的几种用法(二)
    ThreadLocal源码阅读
    MethodInterceptor 的几种用法
    springboot定时器(一)
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2964489.html
Copyright © 2020-2023  润新知