8数码的进化~~15数码!
和8数码一样,也可以用逆序数来分析,不过不同的是:
当你上下移动空格的时候,逆序数会改变,可是左右移动的时候逆序数不会变,
这个时候呢~
就需要刷一点小聪明了
比如把2移动到他需要移动到的位置,我们可以计算移动到那个地方的时候奇偶性会改变多少次
这只和它的纵坐标有关,对吧?
所以只要分析当前局面的逆序数再加上要把所有数字移动到他们的标准位置你所需要改变的奇偶性的次数
对于这个数,如果它是偶数,则可以,如果是奇数,就不可以
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int a[5][5];
vector<int>v;
int dx(int temp)
{
return (temp-1)/4 + 1;
}
int dy(int temp)
{
return (temp-1)%4 + 1;
}
bool find()
{
int re = 0;
for(int i=0;i<v.size();i++)
{
for(int u=i+1;u<v.size();u++)
{
if(v[i]>v[u])
{
re++;
}
}
}
int temp;
for(int i=1;i<=4;i++)
{
for(int u=1;u<=4;u++)
{
if(!a[i][u]) continue;
temp = a[i][u];
re += dx(temp)+i;
}
}
re%=2;
if(re) return false;
else return true;
}
int main()
{
v.clear();
for(int i=1;i<=4;i++)
{
for(int u=1;u<=4;u++)
{
cin>>a[i][u];
if(a[i][u])
v.push_back(a[i][u]);
}
}
if(find())
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
return 0;
}