USACO6.5.3 Betsy's Tour(betsy)

数据范围很小,不用写插头dp,dfs加上强力一些的剪枝就可以ac了,具体都写到代码里了


/*
ID:xsy97051
LANG:C++
TASK:betsy
*/
//数据小,不用插头dp,各种强力剪枝就ok 
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
 
using namespace std;
 
bool map[9][9];
int pos[][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int n,ans=0;
 
int getlive(int x, int y)
{
	int t=0;
	for(int k=0;k<4;k++)
		if(!map[x+pos[k][0]][y+pos[k][1]])
			t++;
	return t;
}
 
void dfs(int x, int y, int sum)
{
	if(x == n && y == 1)//剪枝1,不能提前到达终点
	{
		if(sum==n*n) ans++;
		return;
	}
	if((map[x][y-1] && map[x][y+1] && !map[x-1][y] && !map[x+1][y]) || 
	   (!map[x][y-1] && !map[x][y+1] && map[x-1][y] && map[x+1][y])) //剪枝2,孤立区域剪枝
		return;
	int mx,my,count=0;
	for(int i=0;i<4;i++)//剪枝3,格子的度的处理	
	{
		int X=x+pos[i][0],Y=y+pos[i][1];
		if(map[X][Y] || (X==n && Y==1)) continue;
		if(getlive(X,Y)<2)
		{
			count++;
			mx=X;
			my=Y;	
		}
	}
	
	if(count>1)
		return;
	else
		{
			if(count==1)
			{
				map[mx][my]=1;
				dfs(mx,my,sum+1);
				map[mx][my]=0;
			}
			else
				for(int i=0;i<4;i++)
				{
					int X=x+pos[i][0], Y=y+pos[i][1];
					if(!map[X][Y])
					{
						map[X][Y]=1;
						dfs(X,Y ,sum+1);
						map[X][Y]=0;
					}
				}
		}
}
 
int main(){
	freopen("betsy.in","r",stdin);
	freopen("betsy.out","w",stdout);
	cin >> n;
	for(int i=1;i<=n;i++)	//处理边界
		map[1][1]=map[0][i]=map[n+1][i]=map[i][0]=map[i][n + 1]=1;
	dfs(1,1,1);	
	cout<<ans<< endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值