UVALive - 5542 Commedia dell' arte 三维n数码问题

其实,,,不管二维三维的这类问题,本质都是一个置换群的对换问题

一置换中的一个长度为k的循环,至少需要k-1次对换才能恢复

对换有个性质就是,一个对换不管变奇偶性都是相同的

我们来看这道题,,其实移动一次0的,,就相当于一个对换,,

我们先将这个三维n数码化为置换,找出有w个循环,那么就说明至少需要对换n*n*n-w次,

再看0到最终位置最小步数x

如果x和n*n*n-x同奇偶性,就说明2个置换能通过对换互相转换,,,恩

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define FIN freopen("input.txt","r",stdin)
#define mem(x,y) memset(x,y,sizeof(x))
typedef unsigned long long ULL;
typedef long long LL;
#define fuck(x) cout<,int> PIII;
typedef pair PII;
const double eps=1e-5;
const int MX=1e6+5;
const int P=9973;
int n,w[MX];
bool vis[MX];
namespace IO
{
const int MX = 4e7;
char buf[MX];
int c, sz;
void begin()
{
    c = 0;
    sz = fread(buf, 1, MX, stdin);
}
inline bool read(int &t)
{
    while(c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++;
    if(c >= sz) return false;
    bool flag = 0;
    if(buf[c] == '-') flag = 1, c++;
    for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t * 10 + buf[c] - '0';
    if(flag) t = -t;
    return true;
}
}
int main()
{
    IO::begin();
    int T;
    IO::read(T);

    while(T--)
    {
        IO::read(n);
        int pp=0;
        for(int z=0; z


你可能感兴趣的:(UVALive - 5542 Commedia dell' arte 三维n数码问题)