1 条题解

  • 0
    @ 2024-12-24 9:54:29

    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
    上传者