P1312 Mayan游戏

无秒

2020-05-16 20:57:29

Personal

这题是个非常简单~~(难的要死)~~的搜索。真的没啥技巧(讲透了就那个简单的剪枝),然后,就靠着码力刚了……qwq 这个思路稍微的讲一下(思路简单,代码……):就是搜索,没啥别的。 首先,明确搜索包含的东西:其实就是搜到第x步,只要传这个就行,x>n(完成需要步数)时肯定return了。 还有要砍的就是,要往一个方向搜(就像之前的小木棍,就直接接着上一个搜,否则就会有很多种(组合的庞大数量,我就不用讲了吧……))。 然后要加上几个函数(就是方便一点,而且这非常有利于思路的清晰)(简单的就不讲详细了): (感谢消灭星星)首先,判断一下最后是否图里面还有没有星星;其次,就是消除星星后掉下星星;接着,消灭星星!因为它说假如是横竖3个的交集,全都要消去(差不多等于消灭星星),所以把所有的3个点标记,统一去掉就OK;最后就是交换星星,swap嘛,然后掉下来,去除相同的,再掉下来……然后,dfs就直接OK了…… ```cpp #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int a[6][8],ans[6][4],temp[6][6][8]; int n; bool c[6][8]; inline void read(int &x) { x=0; int f=0; char ch=getchar(); while(!isdigit(ch)) f|=(ch=='-'),ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); } inline void write(int x) { char s[30]; int top=0; while(x) s[++top]=x%10,x/=10; if(!top) putchar('0'); else while(top) putchar(s[top--]+'0'); } bool check() { for(int i=5;i>=1;i--) if(a[i][1]) return false; return true; } void copy(int x){ for(int i=1;i<=5;i++) for(int j=1;j<=7;j++) temp[x][i][j]=a[i][j]; } void fall() { int x; for(int i=1;i<=5;i++){ x=0; for(int j=1;j<=7;j++){ if(!a[i][j]) x++; else{ if(!x) continue; a[i][j-x]=a[i][j]; a[i][j]=0; } } } } bool clear() { bool flag=false; for(int i=1;i<=5;i++) for(int j=1;j<=7;j++) { if(i>1&&i<5&&a[i][j]==a[i-1][j]&&a[i][j]==a[i+1][j]&&a[i][j]) c[i][j]=c[i-1][j]=c[i+1][j]=flag=true; if(j>1&&j<7&&a[i][j]==a[i][j-1]&&a[i][j]==a[i][j+1]&&a[i][j]) c[i][j]=c[i][j-1]=c[i][j+1]=flag=true; } if(!flag) return false; for(int i=1;i<=5;i++) for(int j=1;j<=7;j++) if(c[i][j]) { c[i][j]=false; a[i][j]=0; } return true; } void move(int i,int j,int x) { swap(a[i][j],a[i+x][j]); fall(); while(clear()) fall(); } void dfs(int x) { if(check()){ for(int i=1;i<=n;i++){ for(int j=1;j<=3;j++) printf("%d ",ans[i][j]); if(i!=n) printf("\n"); } exit(0); } if(x>n) return; copy(x); for(int i=1;i<=5;i++) for(int j=1;j<=7;j++) //if(a[i][j]) { if(i<5&&a[i][j]!=a[i+1][j]){ move(i,j,1); ans[x][1]=i-1;ans[x][2]=j-1;ans[x][3]=1; dfs(x+1); for(int i=1;i<=5;i++) for(int j=1;j<=7;j++) a[i][j]=temp[x][i][j]; ans[x][1]=ans[x][2]=ans[x][3]=-1; } /*if(i>1&&a[i-1][j]==0){ move(i,j,-1); ans[x][1]=i-1;ans[x][2]=j-1;ans[x][3]=-1; dfs(x+1); for(int i=1;i<=5;i++) for(int j=1;j<=7;j++) a[i][j]=temp[x][i][j]; ans[x][1]=ans[x][2]=ans[x][3]=-1; }*/ } } int main() { read(n); for(int i=1;i<=5;i++) for(int j=1;j<=8;j++) { read(a[i][j]); if(a[i][j]==0) break; } dfs(1); printf("-1"); return 0; } ```