top1编程
← 返回题目
题解

【提高】洗牌2

3 条题解

  • 0
    @ 2026-7-29 20:24:13
    #include<bits/stdc++.h>
    using namespace std;
    int a[55], b[55];//b是暂存数组。
    int main(){
    	int n, m, k, left, right;
    	cin >> n >> m;
    	for (int i = 0; i < n; i++) {
    		cin >> a[i];
    	}
    	for (int i = 0; i < m; i++) {
    		cin >> k;//k是指令,0或1.
    		if (k) {
    			cin >> left >> right;
    			int c = 0;
    			//将范围内的牌放到顶端,也就是放在b数组的最前面
    			for (int j = left - 1; j < right; j++) {
    				b[c++] = a[j];
    			}
    			//原本的牌按顺序落下,也就是继续接在b数组的后面。
    			for (int j = 0; j < left - 1; j++) {
    				b[c++] = a[j];
    			}
    			for (int j = right; j < n; j++) {
    				b[c++] = a[j];
    			}
    			//将暂存数组b里面整理好的牌放回a数组,方便多次洗牌操作。
    			for (int j = 0; j < n; j++) {
    				a[j] = b[j];
    			}
    			
    		}else {
    			//指令为0时的弹牌操作
    			int c = 0;
    			for (int j = 0; j < n / 2; j++) {//n是偶数,直接除2,分为前后两部分交叉存放到b数组。
    				b[c++] = a[j];
    				b[c++] = a[j + n / 2];	
    			}
    			for (int j = 0; j < n; j++) {
    				a[j] = b[j];
    			}
    		}
    	}
    	//输出洗牌后的结果。
    	for (int i = 0; i < n; i++) {
    		cout << a[i] << " ";
    	}
    	
    	return 0;
    }
    
    • 0
      @ 2026-7-29 0:06:22
      #include<bits/stdc++.h>
      using namespace std;
      int a[55], b[55];
      int main(){
      	int n, m, k, left, right;
      	cin >> n >> m;
      	for (int i = 0; i < n; i++) {
      		cin >> a[i];
      	}
      	for (int i = 0; i < m; i++) {
      		cin >> k;
      		if (k) {
      			cin >> left >> right;
      			int c = 0;
      			for (int j = left - 1; j < right; j++) {
      				b[c++] = a[j];
      			}
      			for (int j = 0; j < left - 1; j++) {
      				b[c++] = a[j];
      			}
      			for (int j = right; j < n; j++) {
      				b[c++] = a[j];
      			}
      			for (int j = 0; j < n; j++) {
      				a[j] = b[j];
      			}
      			
      		}else {
      			int c = 0;
      			for (int j = 0; j < n / 2; j++) {
      				b[c++] = a[j];
      				b[c++] = a[j + n / 2];	
      			}
      			for (int j = 0; j < n; j++) {
      				a[j] = b[j];
      			}
      		}
      	}
      	for (int i = 0; i < n; i++) {
      		cout << a[i] << " ";
      	}
      	
      	return 0;
      }
      
      • 0
        @ 2026-7-28 22:09:36
        #include <bits/stdc++.h>
        using namespace std;
        
        int a[100],b[100];
        int i,j,n,order,x,y,m,k;
        int main() {
        	cin>>m>>n;
        	//m张牌
        	for(i = 1; i <= m; i++) {
        		cin>>a[i];
        	}
        
        	for(i = 1; i <= n; i++) {
        		cin>>order;
        		//切牌
        		if(order == 1) {
        			k = 1;//下标清零
        			cin>>x>>y;
        			for(j = x; j <= y; j++) {
        				b[k] = a[j];
        				k++;
        			}
        
        			for(j = 1; j < x; j++) {
        				b[k] = a[j];
        				k++;
        			}
        
        			for(j = y + 1; j <= m; j++) {
        				b[k] = a[j];
        				k++;
        			}
        
        			//拷贝回去
        			for(j = 1; j <= m; j++) {
        				a[j] = b[j];
        			}
        		} else {
        			for(j = 1; j <= m / 2; j++) {
        				b[j*2-1]=a[j];
        				b[j*2]=a[m/2+j];
        			}
        
        			for(j = 1; j <= m; j++) {
        				a[j] = b[j];
        			}
        		}
        	}
        
        	for(i = 1; i <= m; i++) {
        		cout<<a[i]<<" ";
        	}
        
        
        }
        
        • 1