Nettoyer la pièce - niuke.com - Questions d'entretien

Description du titre

C'était encore le week-end et la chambre de Xiao Yi était en désordre.

Il espère régler un peu le désordre au sol pour que chaque bloc de désordre ait l'air plus compact et moins salissant.

Il y a n amas de débris sur le sol, et chaque amas de débris contient 4 objets. Les coordonnées du i-ème élément sont représentées par (ai, bi), et Xiao Yi peut le faire pivoter dans le sens antihoraire autour de (xi, yi) de 90 ^ \ circ90∘ à chaque fois, ce qui consommera ses temps de mouvement. Si 4 points d'un amas de débris forment un carré d'aire autre que 0, on dit qu'il est compact.

Parce que Xiao Yi est paresseux, il espère que vous pourrez l'aider à calculer le nombre minimum d'étapes requises pour chaque bloc de débris pour le rendre compact.

Entrez la description:

Un nombre n (1 <= n <= 100) dans la première ligne indique le nombre d'amas de débris. 
Les 4n lignes suivantes, chacune 4 lignes représentent un amas de débris, chaque ligne a 4 nombres ai, bi, xi, yi, (-104 <= xi, yi, ai, bi <= 104), ce qui signifie le i-ème l'élément fait pivoter ses propres coordonnées et coordonnées du point central.

Description de la sortie:

N lignes, 1 nombre par ligne, indiquant le nombre minimum de coups.

Exemple 1

Entrer

4 
1 1 0 0 
-1 1 0 0 
-1 1 0 0 
1 -1 0 0 
1 1 0 0 
-2 1 0 0 
-1 1 0 0 
1 -1 0 0 
1 1 0 0 
-1 1 0 0 
-1 1 0 0 
-1 1 0 0 
2 2 0 1 
-1 0 0 -2 
3 0 0 -2 
-1 1 -2 0

Sortir

1 -1 3 3

La description

Pour le premier groupe de débris, nous pouvons faire pivoter le deuxième ou le troisième objet une fois.

Code de référence:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <bitset>
#include <unordered_map>
#include <stack>
#include <queue>
#include <deque>
#include <limits.h>
#include <cstdio>
using namespace std;
 
struct Item{
    int a, b, x, y, state;
    Item(){
        state = 0;
    }
 
    void crot(){
        state = (state + 1) % 4;
        int dx = a-x, dy = b-y;
        a = x - dy;
        b = y + dx;
    }
 
    void input(){
        cin>>a>>b>>x>>y;
        state = 0;
    }
 
    bool operator ==(const Item &item2){
        return a==item2.a && b==item2.b;
    }
 
    Item operator +(const Item &it2){
        Item res;
        res.a = a + it2.a;
        res.b = b + it2.b;
        return res;
    }
 
    Item operator -(const Item &it2){
        Item res;
        res.a = a - it2.a;
        res.b = b - it2.b;
        return res;
    }
 
    static bool ortho(const Item &it1, const Item &it2){
        if(it1.a==0 && it1.b== 0) return 0;
        if(it2.a==0 && it2.b == 0) return 0;
        return it1.a * it2.a + it1.b * it2.b == 0;
    }
};
 
struct Pack{
    vector<Item> itemList;
    vector<Item*> itp;
    int step;
 
    Pack(){
        itemList = vector<Item>(4);
        itp = vector<Item*>(4, nullptr);
        for(int i=0; i<4; ++i) itp[i] = &itemList[i];
        step = INT_MAX;
    }
 
    void input(){
        for(int i=0; i<4;++i)
            itemList[i].input();
        step = INT_MAX;
    }
 
    bool isSqaure(){
        for(int i=1; i<4; ++i){
            if(i!=1) swap(itp[i], itp[1]);
            if(*itp[0]==*itp[1] || *itp[2]==*itp[3]) return 0;
            if(!(*itp[0] + *itp[1] == *itp[2] + *itp[3])) continue;
            if(!Item::ortho(*itp[0]- *itp[1], *itp[2] - *itp[3])) continue;
            if(Item::ortho(*itp[0]- *itp[2], *itp[0] - *itp[3])) return 1;
        }
        return 0;
    }
 
    void trySqaure(int rot_idx){
        for(int i=0; i<4; ++i){
            if(rot_idx == 0 && isSqaure()){
                int tmp_step = 0;
                for(int j=0; j<4; ++j) tmp_step += itemList[j].state;
                if(step > tmp_step) step = tmp_step;
            }
            if(rot_idx > 0) trySqaure(rot_idx - 1);
            itemList[rot_idx].crot();
        }
    }
};
 
int main()
{
    int n;
    cin>>n;
    Pack eRoom;
    for(int i=0; i<n; ++i){
        eRoom.input();
        eRoom.trySqaure(3);
        cout<<(eRoom.step > 16 ? -1: eRoom.step)<<endl;
    }
}

 

Je suppose que tu aimes

Origine blog.csdn.net/qq_40513792/article/details/104287903
conseillé
Classement