mayan游戏
这道题超级好 就是我太菜了写了几个小时不算是debug了几个小时。
我只想出了几个小剪枝 可能是状态不太好吧 写完这道题真的是完美诠释了什么,叫做:
暴力出奇迹!!! 真的是太暴力了.
最多只移动5步 时间复杂度为 35^5但是并非如此 因为要下落什么的还要消除什么的还要重新赋值什么的。
这样的复杂度为(35*35)^5= 1225^5 早 超时了 但是剪枝的力量是无穷的!
有 交换两个相同颜色块减掉 当前局面有某种颜色数量<=2减掉 如果右边是空的我们再考虑向左移动否则就全部向右移动
大体上就这几个。 练习了一下dfs 没想到 错误百出。
1 fall 的时候 没想清楚 应该怎么下落
2 剪枝的不够精准
3 i j 疯狂打错 0 疯狂打成1
4 内外循环没分清
5 细枝末节j 打成j-1
6 以为函数传递数组回溯时该数组原本的值不会改变,其实是会改变的。
7 没有充分考虑好细节 什么时候需要fall没考虑清楚
8 最后 本人菜的要死。照着题解代码拍还拍了几个小时才全部改出来
9 缺乏勇气 感觉要超时就不敢写 没了 气死了。。。
//#include<bits/stdc++.h> #include<iomanip> #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<queue> #include<deque> #include<cmath> #include<ctime> #include<cstdlib> #include<stack> #include<algorithm> #include<vector> #include<cctype> #include<utility> #include<set> #include<bitset> #include<map> #define INF 2147483646 #define ll long long #define min(x,y) (x>y?y:x) #define max(x,y) (x>y?x:y) #define R register #define up(p,i,n) for(int i=p;i<=n;++i) using namespace std; char buf[1<<15],*fs,*ft; inline char getc() { return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++; } inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void put(ll x) { x<0?x=-x,putchar('-'):0; int num=0;char ch[50]; while(x)ch[++num]=x%10+'0',x/=10; num==0?putchar('0'):0; while(num)putchar(ch[num--]); putchar('\n');return; } int n=6,m=4,b,T,flag; int vis[7][5]; int a[7][5],cnt[11]; struct wy { int x,y,k; }t[6]; int move() { int flag=0; up(0,i,n)up(0,j,m) { if(!a[i][j])continue; if(j<=m-2)if(a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2]) vis[i][j]=vis[i][j+1]=vis[i][j+2]=1,flag=1; if(i<=n-2)if(a[i][j]==a[i+1][j]&&a[i][j]==a[i+2][j]) vis[i][j]=vis[i+1][j]=vis[i+2][j]=1,flag=1; } return flag; } void fall() { up(0,i,n)up(0,j,m)if(vis[i][j])a[i][j]=0; up(0,j,m) up(0,i,n) { if(!a[i][j]) { up(i+1,k,n) if(a[k][j]){a[i][j]=a[k][j];a[k][j]=0;break;} } } memset(vis,0,sizeof(vis)); return; } void dfs(int depth) { if(depth==b+1) { int flag=0; up(0,i,n)up(0,j,m)if(a[i][j]){flag=1;break;} if(!flag) { up(1,i,b)printf("%d %d %d\n",t[i].x,t[i].y,t[i].k); exit(0); } return; } up(0,i,n)up(0,j,m)cnt[a[i][j]]++; up(1,i,10)if(cnt[i]==1||cnt[i]==2)return; int tmp[7][5]; up(0,i,n)up(0,j,m)tmp[i][j]=a[i][j]; up(0,j,m) { up(0,i,n) { if(!a[i][j])continue; if(a[i][j]!=a[i][j+1]&&j+1<=m) { swap(a[i][j],a[i][j+1]); t[depth]=(wy){j,i,1}; fall(); while(move())fall(); dfs(depth+1); up(0,i,n)up(0,j,m)a[i][j]=tmp[i][j]; } if(j-1>=0&&a[i][j-1]==0) { swap(a[i][j],a[i][j-1]); t[depth]=(wy){j,i,-1}; fall(); while(move())fall(); dfs(depth+1); up(0,i,n)up(0,j,m)a[i][j]=tmp[i][j]; } } } } int main() { //freopen("1.in","r",stdin); b=read(); up(0,i,m) { int t=0,x; while(1) { x=read(); if(x==0)break; a[t][i]=x; ++t; } } /*for(int i=n;i>=0;--i) { for(int j=0;j<=m;++j)cout<<a[i][j]<<' '; puts(""); }*/ dfs(1); put(-1); return 0; }
无法逃避的是自我,而无法挽回的是过去。——机动战士高达