E - Xenia and Dominoes

E - Xenia and Dominoes_第1张图片

E - Xenia and Dominoes_第2张图片

E - Xenia and Dominoes_第3张图片





感谢lzxiang提供题解以及代码




E - Xenia and Dominoes_第4张图片

E - Xenia and Dominoes_第5张图片




#include
#include
#include
using namespace std;

/*
  设计状态:dp[i][j][k][l]表示在i列,状态为j,k,l时的方案数 
*/

const int MOD=1000000007;

struct dog
{
  int x1,y1,x2,y2;
}egg[5];

int n,sx=-1,sy=-1,cnt=0;

char s[50][10000+10];

long long dp[10000+10][2][2][2];

int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};

dog get(int x1,int y1,int x2,int y2)
{
  dog a;
  a.x1=x1;a.y1=y1;a.x2=x2;a.y2=y2;
  return a;
}

long long dfs()
{
  for(int i=0;i=0&&x2>=0&&x10&&y2>0&&y1<=3&&y2<=3&&s[y1][x1]=='.'&&s[y2][x2]=='.')
	{
		egg[++cnt]=get(y1,x1,y2,x2);
	}
  } 
  //printf("%d %d %d\n",sx,sy,cnt);
  //下方容斥原理 
  long long ans=0;
  
  if(cnt>=1)
  {
  	for(int i=1;i<=cnt;i++)
  	{
  	  s[egg[i].x1][egg[i].y1]='X';
  	  s[egg[i].x2][egg[i].y2]='X';
  	  ans=(ans+dfs())%MOD;
  	  s[egg[i].x1][egg[i].y1]='.';
  	  s[egg[i].x2][egg[i].y2]='.';
  	}
  }
  if(cnt>=2)
  {
  	for(int i=1;i=3)
  {
  	for(int i=1;i<=cnt;i++)
  	{
  	  s[egg[i].x1][egg[i].y1]='X';
  	  s[egg[i].x2][egg[i].y2]='X';
  	}
  	ans=(ans+dfs())%MOD;
  }
  
  cout<


你可能感兴趣的:(DP)