zoukankan      html  css  js  c++  java
  • 【codeforces 1025E】Colored Cubes 【构造】

    题意

       有一个n*n的棋盘和m个棋子,每个棋子有一个初始位置和一个目标位置,每次移动只能选择一个棋子移动到他相邻的格子,并且花费一秒钟。请你找出一个移动的方法,使得在10800步内将所有棋子移动到目标位置。
    分析

      不是求最少步数!!不是!!题目中保证一定有解,所以很容易想到是构造(场上并没有)

      先读入每个棋子的起始位置,然后将第i个棋子移动到(i,i)位置。然后读入每个棋子的终止位置,然后也将其移动到(i,i)位置,然后正着输出第一个方案,倒着输出第二个方案。

      然后我们怎么考虑将i个棋子移动到(i,i)位置时不冲突。我们先将每个点按照行坐标进行排序,然后行坐标第i大的点移动到第i行,此时每一行最多只有一个点,然后移动列坐标,将点i移动到第i列,显然不会出现冲突。现在每一列最多只有一个点,然后我们将点i移动到第i行。每一步记录一下就可以了。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <algorithm>
     5 
     6 
     7 using namespace std;
     8 const int maxn=100+10;
     9 struct Node{
    10     int x,y,id;
    11     bool operator<(const Node& rhs)const{
    12         return (x<rhs.x||(x==rhs.x&&y<rhs.y));
    13     }
    14 }node[maxn],anss[10800],anst[10800];
    15 int n,m;
    16 int Move(int step,int x1,int y1,int x2,int y2){
    17     while(x1!=x2){
    18         if(x1<x2){
    19             anss[++step].x=x1,anss[step].y=y1;
    20             ++x1;
    21             anst[step].x=x1,anst[step].y=y1;
    22         }else{
    23             anss[++step].x=x1,anss[step].y=y1;
    24             --x1;
    25             anst[step].x=x1,anst[step].y=y1;
    26         }
    27     }
    28     while(y1!=y2){
    29         if(y1<y2){
    30             anss[++step].x=x1,anss[step].y=y1;
    31             ++y1;
    32             anst[step].x=x1,anst[step].y=y1;
    33         }else{
    34             anss[++step].x=x1,anss[step].y=y1;
    35             --y1;
    36             anst[step].x=x1,anst[step].y=y1;
    37         }
    38     }
    39     return step;
    40 }
    41 int solve(int step){
    42     sort(node+1,node+1+m);
    43     for(int i=1;i<=m;i++){
    44         if(node[i].x>i){
    45             step=Move(step,node[i].x,node[i].y,i,node[i].y);
    46             node[i].x=i;
    47         }
    48     }
    49     for(int i=m;i>=1;i--){
    50         step=Move(step,node[i].x,node[i].y,i,node[i].y);
    51         node[i].x=i;
    52     }
    53     for(int i=1;i<=m;i++){
    54         step=Move(step,node[i].x,node[i].y,node[i].x,node[i].id);
    55         node[i].y=node[i].id;
    56     }
    57     for(int i=1;i<=m;i++){
    58         step=Move(step,node[i].x,node[i].y,node[i].id,node[i].y);
    59         node[i].x=node[i].id;
    60     }
    61     return step;
    62 }
    63 int main(){
    64     scanf("%d%d",&n,&m);
    65     for(int i=1;i<=m;i++){
    66         scanf("%d%d",&node[i].x,&node[i].y);
    67         node[i].id=i;
    68     }
    69     int step1=solve(0);
    70 
    71     for(int i=1;i<=m;i++){
    72         scanf("%d%d",&node[i].x,&node[i].y);
    73         node[i].id=i;
    74     }
    75 
    76     int step2=solve(step1);
    77     printf("%d
    ",step2);
    78     for(int i=1;i<=step1;i++){
    79         printf("%d %d %d %d
    ",anss[i].x,anss[i].y,anst[i].x,anst[i].y);
    80     }
    81     for(int i=step2;i>step1;i--){
    82         printf("%d %d %d %d
    ",anst[i].x,anst[i].y,anss[i].x,anss[i].y);
    83     }
    84 
    85 return 0;
    86 }
    View Code
  • 相关阅读:
    KMP
    KMP算法的Next数组详解
    从头到尾彻底理解KMP
    通信协议:HTTP、TCP、UDP
    十大Intellij IDEA快捷键
    Java连接oracle数据库的两种常用方法
    Oracle 数据类型
    Oracle 数据库、实例、用户、表空间、表之间的关系
    Android中的Handler的机制与用法详解
    在Android开发中,定时执行任务的3种实现方法
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/9530857.html
Copyright © 2011-2022 走看看