【警示后人】关于最后一个点WA

P1219 [USACO1.5] 八皇后 Checker Challenge

Novaorbit @ 2024-03-13 20:24:12

由于某些不可知原因,本题开O2可能会发生一些神奇的错误。
比如下面这份代码,在O2下提交会WA最后一个点,但是关掉O2就可以AC。

所以如果你认为自己的代码没有问题却会出现奇奇怪怪的WA,请关闭O2再试试。

代码如下:

#include<iostream>
using namespace std;
int n,ztag[21][21],ans,zrec[11];
void find(int x,int y)
{
    if(x==n-1)
    {
        ++ans;
        if(ans<4)
        {
            for(int i=0;i<x;++i)    cout<<zrec[i]+1<<" ";
            cout<<y+1<<endl;
        }
        return;
    }
    zrec[x]=y;
    for(int i=x;i<n;++i)    ++ztag[i][y];
    for(int i=x+1,j=y+1;i<n&&j<n;++i,++j)   ++ztag[i][j];
    for(int i=x+1,j=y-1;i<n&&j>=0;++i,--j) ++ztag[i][j];
    for(int i=0;i<n;++i)    if(!ztag[x+1][i])    find(x+1,i);
    for(int i=x;i<n;++i)    --ztag[i][y];
    for(int i=x+1,j=y+1;i<n&&j<n;++i,++j)   --ztag[i][j];
    for(int i=x+1,j=y-1;i<n&&j>=0;++i,--j) --ztag[i][j];
    return;
}
int main()
{

    cin>>n;
    for(int i=0;i<n;++i)    find(0,i);
    cout<<ans<<endl;
    // system("pause");
    return 0;
}

by _yukinoshita_yukino @ 2024-04-25 20:42:00

多谢了哥们


by AnnaQ @ 2024-05-17 12:11:53

你的代码可能UB


|