1. 程式人生 > >mayan遊戲

mayan遊戲

code register ++ putc 分享 img bit ack gis

  技術分享圖片

技術分享圖片

技術分享圖片

這道題超級好 就是我太菜了寫了幾個小時不算是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; }
View Code 無法逃避的是自我,而無法挽回的是過去。——機動戰士高達

mayan遊戲