BZOJ 1088: [SCOI2005]扫雷Mine 枚举

枚举前两位,递推剩下的

1088: [SCOI2005]扫雷Mine

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 1832  Solved: 1090

[Submit][Status][Discuss]

Description

相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。

Input

第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)

Output

一个数,即第一列中雷的摆放方案数。

Sample Input

2

1 1

Sample Output

2

HINT

Source

/* ***********************************************
Author        :CKboss
Created Time  :2015年04月28日 星期二 20时49分17秒
File Name     :BZOJ1088.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

const int maxn=11000;

int n,a[maxn],b[maxn],ans;

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",a+i);

	if(n==1)
	{
		if(a[1]<=0) puts("1");
		else puts("0");
		return 0;
	}
	if(n==2)
	{
		if(a[1]==0&&a[2]==0) puts("1");
		else if((a[1]==1&&a[2]==0)||(a[1]==0&&a[2]==1)) puts("2");
		else if(a[1]==2&&a[2]==2) puts("1");
		else puts("0");
		return 0;
	}

	bool flag;
	if(a[1]==0)
	{
		/// 0,0
		memset(b,0,sizeof(b));
		flag=true;
		int presum=0;
		for(int i=3;i<=n&&flag;i++)
		{
			int next=a[i-1]-presum;
			if(next==1||next==0)
			{
				b[i]=next;
			}
			else flag=false;
			presum-=b[i-2];
			presum+=next;
		}
		if(b[n]+b[n-1]!=a[n]) flag=false;
		if(flag) ans++;
	}
	if(a[1]==1)
	{
		/// 0,1
		flag=true;
		int presum=1;
		memset(b,0,sizeof(b)); b[2]=1;
		for(int i=3;i<=n&&flag;i++)
		{
			int next=a[i-1]-presum;
			if(next==1||next==0)
			{
				b[i]=next;
			}
			else flag=false;
			presum-=b[i-2];
			presum+=next;
		}
		if(b[n]+b[n-1]!=a[n]) flag=false;
		if(flag) ans++;

		/// 1,0
		flag=true;
		presum=1;
		memset(b,0,sizeof(b)); b[1]=1;
		for(int i=3;i<=n&&flag;i++)
		{
			int next=a[i-1]-presum;
			if(next==1||next==0)
			{
				b[i]=next;
			}
			else flag=false;
			presum-=b[i-2];
			presum+=next;
		}
		if(b[n]+b[n-1]!=a[n]) flag=false;
		if(flag) ans++;

	}
	if(a[1]==2)
	{
		// 1,1
		memset(b,0,sizeof(b));
		b[1]=b[2]=1;
		flag=true;
		int presum=2;
		for(int i=3;i<=n&&flag;i++)
		{
			int next=a[i-1]-presum;
			if(next==1||next==0)
			{
				b[i]=next;
			}
			else flag=false;
			presum-=b[i-2];
			presum+=next;
		}
		if(b[n]+b[n-1]!=a[n]) flag=false;
		if(flag) ans++;
	}

	printf("%d\n",ans);

    return 0;
}
时间: 2024-12-22 07:45:50

BZOJ 1088: [SCOI2005]扫雷Mine 枚举的相关文章

[BZOJ 1088][SCOI2005]扫雷Mine

Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. Input 第一行为N,第二行有N个数,依次为第二列的格

Bzoj 1088: [SCOI2005]扫雷Mine (DP)

Bzoj 1088: [SCOI2005]扫雷Mine 怒写一发,算不上DP的游戏题 知道了前\(i-1\)项,第\(i\)项会被第二列的第\(i-1\)得知 设\(f[i]\)为第一列的第\(i\)行位置是否有雷,有雷的话,\(f[i] = 1\),无雷\(f[i] = 0\) \(a[i]\)就是题目读入的东西. 那么转移方程就是\(f[i] = a[i - 1] - f[i - 1] - f[i - 2]\) 不满足限制的时候就是\(f[i] < 0\) 或者$ f[i] > 1$ 第一

1088: [SCOI2005]扫雷Mine

1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1635  Solved: 979[Submit][Status] Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些

【水题】【SCOI 2005】【bzoj 1088】扫雷Mine

1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2180 Solved: 1272 Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有

【BZOJ】1088: [SCOI2005]扫雷Mine(递推)

http://www.lydsy.com/JudgeOnline/problem.php?id=1088 脑残去想递推去了... 对于每一个第二列的格子,考虑多种情况,然后转移.....QAQ 空间可以降到O(1)...我就不优化了.. 至于题解说的枚举第一行...orz完全想不到. 做法就是:(好麻烦,不说了...就是对应三个格子的状态然后转移 #include <cstdio> #include <cstring> #include <cmath> #include

BZOJ 1088 SCOI2005 扫雷

DFS即可过~ #include <cstdio> #include <algorithm> #include <cstring>   int Map[10005],n,ban[10005],tot;   void dfs(int h){     if(h>n){         if(Map[h-1]+Map[h-2]==ban[h-1]) tot++;         return;     }     if(h==1){         dfs(h+1);

[SCOI2005]扫雷Mine

1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2028  Solved: 1187[Submit][Status][Discuss] Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×

bzoj1088: [SCOI2005]扫雷Mine(DP)

1088: [SCOI2005]扫雷Mine 题目:传送门 题解: 一道DP(玩过扫雷的资深玩家肯定一眼秒%%%) 其实定义一个F数组表示1~i的数目就OK. 前两个格子完全可以与处理出来,后面的for一次就搞定了 水了一题... 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #def

【BZOJ 1088】 [SCOI2005]扫雷Mine

Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. Input 第一行为N,第二行有N个数,依次为第二列的格子中的数.