betsy.cpp

来自「dd牛的usaco源代码!对学习算法」· C++ 代码 · 共 103 行

CPP
103
字号
/*
ID: dd.ener1
PROG: betsy
LANG: C++
*/

#include <cstdio>
#include <cstring>
using namespace std;

const int maxn=16;
int N;
bool s[maxn][maxn];
int xs[maxn];
int ys[maxn];
int nb[maxn][maxn];
int res;

void input(){
	freopen("betsy.in","r",stdin);
	scanf("%d",&N);
}
void pretreat(){
	for(int i=0;i<=N+1;++i)
		s[0][i]=s[i][0]=s[N+1][i]=s[i][N+1]=true;
	for(int i=1;i<=N;++i){
		++nb[i][1];
		++nb[1][i];
		++nb[N][i];
		++nb[i][N];
	}
	nb[N][1]=-1;
}
inline bool can(int x,int y){
	if(s[x][y])return false;
	if(xs[x+1]==N||ys[y-1]==N)return false;
	if((y==1||y==N)&&!s[x-1][y])return false;
	if(x==N&&!s[x][y+1])return false;
	if(x==1&&!s[x][y-1])return false;
	if((!(s[x-1][y]^s[x+1][y]))&&(!(s[x][y-1]^s[x][y+1]))&&(x!=1&&y!=1&&x!=N&&y!=N))return false;
	return true;
}
inline void come(int x,int y){
	s[x][y]=true;
	xs[x]++;
	ys[y]++;
	++nb[x-1][y];
	++nb[x+1][y];
	++nb[x][y-1];
	++nb[x][y+1];
}
inline void go(int x,int y){
	s[x][y]=false;
	xs[x]--;
	ys[y]--;
	--nb[x-1][y];
	--nb[x+1][y];
	--nb[x][y-1];
	--nb[x][y+1];
}
inline bool dead(int x,int y){
	return !s[x][y]&&(nb[x][y]>=3);
}
int search(int x,int y,int n){
	if(n==N*N)return 1;
	if(x==N&&y==1)return 0;
	if(dead(x-1,y)||dead(x+1,y)||dead(x,y-1)||dead(x,y+1))
		return 0;
	come(x,y);
	int dd=dead(x-1,y)+dead(x+1,y)+dead(x,y-1)+dead(x,y+1);
	int res=0;
	if(dd<=1){
		if(!dd){
			if(can(x+1,y))res+=search(x+1,y,n+1);
			if(can(x,y+1))res+=search(x,y+1,n+1);
			if(can(x-1,y))res+=search(x-1,y,n+1);
			if(can(x,y-1))res+=search(x,y-1,n+1);
		}
		else{
			if(dead(x+1,y))res=search(x+1,y,n+1);
			else if(dead(x,y+1))res=search(x,y+1,n+1);
			else if(dead(x-1,y))res=search(x-1,y,n+1);
			else if(dead(x,y-1))res=search(x,y-1,n+1);
		}
	}
	go(x,y);
	return res;
}
void solve(){
	pretreat();
	res=search(1,1,1);
}
void output(){
	freopen("betsy.out","w",stdout);
	printf("%d\n",res);
}
int main(){
	//freopen("betsy.log","w",stdout);
	input();
	solve();
	output();
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?