Limpiar la habitación - niuke.com - preguntas de la entrevista

Descripción del Título

Era fin de semana de nuevo y la habitación de Xiao Yi estaba hecha un desastre.

Espera ordenar un poco el desorden en el suelo para que cada grupo de desorden se vea más compacto y menos desordenado.

Hay n grupos de escombros en el suelo y cada grupo de escombros contiene 4 elementos. Las coordenadas del elemento i-ésimo están representadas por (ai, bi), y Xiao Yi puede rotarlo en sentido antihorario alrededor de (xi, yi) 90 ^ \ circ90∘ cada vez, lo que consumirá sus tiempos de movimiento. Si 4 puntos de un grupo de escombros forman un cuadrado con un área diferente a 0, decimos que es compacto.

Debido a que Xiao Yi es vago, espera que puedas ayudarlo a calcular el número mínimo de pasos necesarios para que cada grupo de escombros sea compacto.

Ingrese descripción:

Un número n (1 <= n <= 100) en la primera línea indica el número de grupos de escombros. 
Las siguientes 4n líneas, cada 4 líneas representan un grupo de escombros, cada línea tiene 4 números ai, bi, xi, yi, (-104 <= xi, yi, ai, bi <= 104), lo que significa el i-ésimo el elemento gira Sus propias coordenadas y coordenadas del punto central.

Descripción de salida:

N filas, 1 número por fila, que indica el número mínimo de movimientos.

Ejemplo 1

ingresar

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

Producción

1 -1 3 3

Descripción

Para el primer grupo de escombros, podemos rotar el segundo o tercer objeto una vez.

Código de referencia:

#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;
    }
}

 

Supongo que te gusta

Origin blog.csdn.net/qq_40513792/article/details/104287903
Recomendado
Clasificación