SGU139 求助
  先算出光标偏离原位置的步数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;
}