NOIP 2011 Day1T3 Mayan游戏

Posted TSOI_Vergil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP 2011 Day1T3 Mayan游戏相关的知识,希望对你有一定的参考价值。

     这道题耗了我整整一个下午,被读入坑了,然后还被各种坑,首先不知道为什么在栈中使用memcpy会崩掉,然后数组越界......

     这题就是一个搜索,考验代码能力和基本的模拟,一个非常有效的剪枝是我们对于向左移动,我们只搜左边没有方块的,因为如果它的左边有方块的话,它俩一定会在搜它左边的块的右边时交换过,剩下的就是模拟方块清除和方块下落的过程,对于方块清除操作,我们可以全部扫一遍,用一个标记数组,对于一个方块判断它上下,左右是否和它同色,如果同色就把它们都打上标签,最后一起处理,对于下落操作,我们可以从下到上扫,然后对于每一个格子看看它下面是不是空的,然后再进行处理。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int g[8][5],n,tot,ans1[10],ans2[10],ans3[10];
const int d[3]=0,-1,1;
bool vis[7][5];

void dfs(int a[7][5],int cur,int cnt) 

	if (cnt==0) 
	
		if (cur==n)
		
			for (int i=1;i<=cur;i++) printf("%d %d %d\\n",ans1[i],ans2[i],ans3[i]);
			exit(0);
		
		return;
	
	if (cur==n) return;	
	int temp[7][5];
	for (int i=0;i<7;i++) 
		for (int j=0;j<5;j++) temp[i][j]=a[i][j];
	for (int j=0;j<5;j++) 
		for (int i=0;i<7;i++) 
		
			if (a[i][j]==0)	continue;
			for (int k=2;k>=1;k--) 
			
				if (j+d[k]<0||j+d[k]>4) continue;
				if (k==1&&a[i][j-1]) continue;
				swap(a[i][j],a[i][j+d[k]]);
				if (a[i][j]==0) 
				
					int p=i-1;
					while (p>=0) 
						if (a[p][j+d[k]]==0) p--;else break;
					p++;
					swap(a[i][j+d[k]],a[p][j+d[k]]);
					for (int ii=1;ii<=6;ii++) 
					
						if (a[ii][j]==0) continue;
						int p1=ii-1;
						while (p1>=0) 
							if (a[p1][j]==0) p1--;else break;
						p1++;
						swap(a[ii][j],a[p1][j]);	
					
				
				bool ok=1;
				int w=0;
				while (ok)
				
					ok=0;
					memset(vis,0,sizeof vis);
					for (int ii=0;ii<7;ii++) 
						for (int jj=0;jj<5;jj++) 
						
							if (ii-1>=0&&ii+1<=6) 
													
								if (a[ii][jj]&&a[ii-1][jj]==a[ii][jj]&&a[ii][jj]==a[ii+1][jj])
									vis[ii-1][jj]=vis[ii][jj]=vis[ii+1][jj]=1,ok=1;
							
							if (jj-1>=0&&jj+1<=4) 
							
								if (a[ii][jj]&&a[ii][jj-1]==a[ii][jj]&&a[ii][jj+1]==a[ii][jj]) 
									vis[ii][jj]=vis[ii][jj-1]=vis[ii][jj+1]=1,ok=1;
							
						
					if (ok==0) break;
					for (int ii=0;ii<7;ii++) 
						for (int jj=0;jj<5;jj++) 
						
							if (a[ii][jj]==0) continue;
							if (vis[ii][jj]) 
							
								w++;
								a[ii][jj]=0;
								continue;		
							
							int p1=ii-1;
							while (p1>=0) 
							
								if (a[p1][jj]==0) 
									p1--;
								else break;
							
							p1++;
							swap(a[p1][jj],a[ii][jj]);
						
				
				ans1[cur+1]=j;ans2[cur+1]=i;
				if (k==2) ans3[cur+1]=1;else ans3[cur+1]=-1;
				dfs(a,cur+1,cnt-w);
				for (int ii=0;ii<7;ii++) 
					for (int jj=0;jj<5;jj++) a[ii][jj]=temp[ii][jj];
			
		


int main()

	scanf("%d",&n);
	for (int j=0;j<=4;j++) 
		for (int i=0;i<=7;i++) 
		
			scanf("%d",&g[i][j]);
			if (g[i][j]==0) break;	
			tot++;
		
	dfs(g,0,tot);
	printf("-1\\n");
	return 0;
	


以上是关于NOIP 2011 Day1T3 Mayan游戏的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1312 [NOIOP2011提高组 Day1T3]Mayan游戏

luoguP1312 Mayan游戏 题解(NOIP2011)

noip提高组2011 Mayan游戏

[NOIP2011提高组day1]-3-mayan游戏

NOIp 2011 mayan游戏 搜索

[NOIP2011提高组]Mayan游戏