SGU 139 Help Needed!
2012-05-02 19:28
253 查看
8数码的进化~~15数码!
和8数码一样,也可以用逆序数来分析,不过不同的是:
当你上下移动空格的时候,逆序数会改变,可是左右移动的时候逆序数不会变,
这个时候呢~
就需要刷一点小聪明了
比如把2移动到他需要移动到的位置,我们可以计算移动到那个地方的时候奇偶性会改变多少次
这只和它的纵坐标有关,对吧?
所以只要分析当前局面的逆序数再加上要把所有数字移动到他们的标准位置你所需要改变的奇偶性的次数
对于这个数,如果它是偶数,则可以,如果是奇数,就不可以
和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; }
相关文章推荐
- [SGU 223]Little Kings(状压DP)
- SGU 108 Self-numbers II
- sgu 119 Magic Pairs
- SGU 106 The equation 翻译 题解
- 求大整数的根——sgu111
- SGU118
- SGU 253 计算几何 判定点是否在凸包内
- SGU 103 Traffic Lights
- SGU 116 Index of super-prime 数论+背包
- SGU 132 一道很恶心的状态压缩dp
- sgu124
- SGU_176 Flow construction 有上下界的网络流
- sgu 242 Student's Morning--最大流 或 多重匹配
- sgu——340(字符串模拟)
- SGU 131 Hardwood floor
- [SGU]108. Self-numbers II
- sgu 103 Traffic Lights
- [SGU]112. a^b - b^a
- [SGU]124. Broken line
- sgu 126 Boxes