1 条题解
-
0
C++ :
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; #define op(i,n) for(int i=0;i<n;i++) #define ed(i,n) for(int i=n-1;i>=0;i--) int n,nn,cnt[20],x[20],y[20],g[20]; void printState(int sz) {for(int i=1;i<=sz;i++)printf("%d %d %d\n",x[i],y[i],g[i]);} struct State { int mp[5][7],sz[5],step; State() { memset(mp,0,sizeof(mp)); memset(sz,0,sizeof(sz)); step=0; } void input() { op(i,5) { int w; while(true) { scanf("%d",&w); if(!w)break; cnt[w]++; mp[i][sz[i]++]=w; } } } bool isFinal() { op(i,5)if(sz[i])return false; return true; } void nextState(int c,int r,int k) { step++; if(sz[c]<=r) {step=n+1;return;} if(k==1) { if(c==4) {step=n+1;return;} } else { if(c==0) {step=n+1;return;} } if(sz[c+k]>r)swap(mp[c][r],mp[c+k][r]); else { mp[c+k][sz[c+k]++]=mp[c][r]; for(int j=r;j<sz[c];j++)mp[c][j]=mp[c][j+1]; sz[c]--; mp[c][sz[c]]=0; } bool flag=1,vis[5][7]; while(flag) { flag=0; memset(vis,0,sizeof(vis)); op(i,5)op(j,sz[i]) { int col=mp[i][j]; int k=i; while(k<5&&mp[k][j]==col)k++; if(k-i>2)for(int x=i;x<k;x++)vis[x][j]=1; k=j; while(k<sz[i]&&mp[i][k]==col)k++; if(k-j>2)for(int x=j;x<k;x++)vis[i][x]=1; } op(i,5)ed(j,sz[i]) { if(vis[i][j]) { flag=1; for(int k=j;k<sz[i]-1;k++)mp[i][k]=mp[i][k+1]; sz[i]--; mp[i][sz[i]]=0; } } } } }; bool dfs(State s) { if(s.step>n)return false; if(s.step==n) if(s.isFinal()){printState(s.step);return true;} else return false; op(i,5)op(j,s.sz[i])for(int k=1;k>=-1;k-=2) { if(k==-1)if(i==0||s.sz[i-1]>j)continue; if(s.mp[i][j]==s.mp[i+k][j])continue; State ns=s; ns.nextState(i,j,k); x[ns.step]=i; y[ns.step]=j; g[ns.step]=k; if(dfs(ns))return true; } return false; } int main() { while(~scanf("%d",&n)) { memset(cnt,0,sizeof(cnt)); State s; s.input(); int flag=0; for(int i=1;i<=10;i++)if(cnt[i]&&cnt[i]<3)flag=-1; if(flag==-1||!dfs(s))puts("-1"); } return 0; }
- 1
信息
- ID
- 1121
- 时间
- 3000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者