这里有两组数据
12 12
..**********
...*********
....********
*....*******
**....******
***....*****
****....****
*****....***
******....**
*******....*
********....
*********...
1
8 7
..*****
...****
....***
*....**
**....*
***....
****...
*****..
1
我的 80 分程序在这两个数据中会跑出非常离谱的结果. 下面是正确程序节选, 我一开始出错的原因是第 3 行的 Up 和 Lef 用的是 char 类型, 但是显然这两个数字已经超出了 char 的范围, 所以在数据较大时会出问题.
当初只为了记两位的信息贪便宜开的 char.
选择这两组数据的原因是答案少, 避免干扰, 方便调试.
if(a[Pli][Plj] ^ '.') {
if(Plj) {for (unsigned k(1); k <= Con; ++k) if (f[i][j][k]) {
unsigned Cur(Find[k]), Up(Cur & (3 << ((Plj + 1) << 1))), Lef(Cur & (3 << ((Plj << 1))));
if(!(Up | Lef)) f[Pli][Plj][List[(Cur ^ Up) ^ Lef]] += f[i][j][k];
}}
else for (unsigned k(1); k <= Con; ++k) if (f[i][j][k]) {
unsigned Cur(Find[k]);
if(!(Cur & 3)) f[Pli][Plj][List[Cur << 2]] += f[i][j][k];
}
continue;
}