Sep
10
SGU 139 求助
2007 解题报告 Popularity: 1%
先算出光标偏离原位置的步数a,再将偏离原位置的数字与其原位置中的数字交换(光标也看作为一个数字),直到所有数字回到原位,记下交换次数b。如果a+b是奇数就无解,反之有解。
为什么目前还不知道,上面是看Amber的题解得到的。
Submit 1: AC。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <iostream> using namespace std; int main() { int d[4][4]; int sum=0; for (int i(0);i<4;i++) for (int j(0);j<4;j++) { cin>>d[i][j]; if (!d[i][j]) { d[i][j]=16; sum+=3-i+3-j; } } for (bool find(true);find;) { find=false; for (int i(0);i<4;i++) for (int j(0);j<4;j++) if (i*4+j+1!=d[i][j]) { swap(d[(d[i][j]-1)/4][(d[i][j]-1)%4],d[i][j]); sum++; find=true; } } if (sum&1) cout<<"NO"<<endl; else cout<<"YES"<<endl; return 0; } |
- http://www.briefdream.com/sgu-139/
- Tags:SGU, 数学
- (1)comments | leave a reply
- Trackback URI
January 20th, 2009 at 11:17 am
这个题目其实就是说两个局面如果逆序对数+光标位置数同奇偶,就可以互相到达,否则不能互相到达,你上面的操作,每一步之间都是可以互相到达的,所以最后可以判断。其实也可以直接求逆序对,lrj的书上有这个方法
Reply