# Backtracking# String# Binary Representation

d471 - 0 與 1 的遊戲

🔗 前往 ZeroJudge 原題

題目描述

題目要求產生所有 n 個 bit 所能表示的 2 進位數字。輸入為 n,輸出為所有長度為 n 的二進位字串,按照字典序排列。

解題思路

這題的核心是產生所有長度為 n 的二進位字串。程式碼使用了一個迴圈來模擬遞迴或 backtracking 的過程。首先,計算出 2^n,然後迭代從 1 到 2^n - 1 的所有數字。對於每個數字,將其轉換為二進位表示形式,並輸出。由於題目要求輸出的是字串形式的二進位數,程式碼直接輸出 "0" 或 "1" 來構建字串。

程式碼首先初始化 a 為 0 和 b 為 1。然後,在 while 迴圈中讀取輸入 a。對於每個輸入 a,程式碼計算出 b 的值,即 2^a。接著,程式碼輸出一個包含 a 個 "0" 的字串。然後,程式碼迭代從 1 到 b 的所有數字,並將每個數字轉換為二進位表示形式,然後輸出。

複雜度分析

  • 時間複雜度: O(2^n * n)
  • 空間複雜度: O(n)

程式碼

#include <iostream>
#include <string>

using namespace std;

int main(){
	long long int a=0,b=1;
	bool next=false;
	while(cin >> a){//a==1 b==2
		for(int i=a;i>0;i--){
			b*=2;
		}
		//---------------------------//
		int arr[a];
		for(int i=0;i<a;i++){
			arr[i]=0;
		}
		//---------------------------//
		for(int i=0;i<a;i++){
			cout << "0";
		}
		cout << endl;
		for(int i=b;i>1;i--){
			arr[a-1]++;//last++
			for(int j=a-1;j>=0;j--){//
				if(arr[j]>1){
					arr[j]-=2;
					arr[j-1]++;
				}
			}
			for(int k=0;k<a;k++){
				cout << arr[k];
			}
			cout << endl;
		}
		a=0;
		b=1;
	}
	
}

Discussion