首页 > 其他 > 详细

P2327 [SCOI2005]扫雷

时间:2021-05-15 19:09:28      阅读:14      评论:0      收藏:0      [点我收藏+]

\(b[i]\)表示第\(i\)个行第一列是否有雷,即\(b[i]\)的值只能为\(0\)\(1\)

一旦第\(i-1\)行第一列的摆放情况确定,因为要满足\(8\)连通的格子里的数字限制,第\(i\)行第一列的摆放情况也随之确定。

递推式:

\[b[i] = a[i-1] - b[i-1] - b[i-2] \]

\(a[i-1]\)表示第\(i-1\)行第二列的数字。

分别令\(b[1]=0\)\(b[1]=1\)即可递推出\(b[2 \sim n]\)

注意点

要判断\(b[n-1]+b[n]\)是否等于\(a[n]\)

const int N=10010;
int a[N],b[N];
int n;
int ans;

bool check()
{
    for (int i = 2; i <= n; i++)
    {
        b[i] = a[i-1] - b[i-1] - b[i-2];
        if(b[i] < 0 || b[i] > 1) return false;
    }
    if (b[n-1] + b[n] != a[n]) return false;
    
    return true;
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];

    b[1] = 1;  // 左边第一格有雷
    if (check()) ans++;
    b[1] = 0;  // 左边第一格没雷
    if (check()) ans++;

    cout << ans << endl;
    //system("pause");
    return 0;
}

P2327 [SCOI2005]扫雷

原文:https://www.cnblogs.com/fxh0707/p/14771273.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!