Untitled

mail@pastecode.io avatar
unknown
c_cpp
7 months ago
1.9 kB
2
Indexable
Never
#include <iostream>
using namespace std;
int num, n, h;
int one_num = 0;
void change(int *arr, int index, int *ori_arr){
	for(int i=index; i<n; i++){//由規定向右找一 
		if(arr[i]==1){
			one_num++;			
		}
		if(arr[i]==1 && i != 0){
			if(arr[i]==1 && arr[i-2] ==0){//找到一,可左移 
				arr[i-1] = 1;//位置向左移 
				arr[i] = 0;
				for(int m2=0; m2<n; m2++){//輸出 
					cout<<arr[m2];
				}
				cout<<endl;
				//one_num++;
				int tem_one_num = 0;
				for(int o = n-1; o>i; o--){//其右邊數恢復最初 
					if(ori_arr[o]==1 && tem_one_num < h-one_num){
						tem_one_num++;
						arr[o] = 1;
					}
					else{
						arr[o] = 0;					
					}
				}
				change(arr, i, ori_arr);//找它右邊的1 
			}
		}
	}
}
int main(){
	cin>>num;
	for(int i=1;i<=num;i++){//有幾場演唱會 
		cin>>n>>h;
		if(n<(2*h-1)){
			cout<<"none"<<endl;
		}
		else{
			int seat_arr[n];
			int ori_arr[n];
			for(int j=0;j<n;j++){//設置一排位置,每個都是0 
				seat_arr[j] = 0;
			}
			//創造第一個序列 
			for(int l=n-1;l>=0;l--){//從陣列的第一個位置 
				if(l==0){
					seat_arr[l] = 1;
					one_num++;
					if(one_num == h){
						break;
					}
				}
				else if(l == n-1){
					if(seat_arr[l-1] != 1){
						seat_arr[l] = 1;
						one_num++;	
						if(one_num == h){
							break;
						}						
					}
				} 
				else if(l != 0 && l!=n-1){//不會超出陣列範圍 
					if(seat_arr[l+1] != 1 && seat_arr[l-1] != 1){
						seat_arr[l] = 1;
						one_num++;
						if(one_num == h){
							break;
						}
					}
				}	
			}
			for(int m1=0; m1<n; m1++){
				ori_arr[m1] = seat_arr[m1];
			}
			//開始排列組合
			for(int m2=0; m2<n; m2++){//輸出 
				cout<<seat_arr[m2];
			}
			cout<<endl;
			while(true){
				one_num = 0;
				change(seat_arr, 0, ori_arr);				
			}				
		}
	}
}
Leave a Comment