ในปัญหานี้ เราได้รับค่าจำนวนเต็มสองค่า k และ n และเราต้องพิมพ์ลำดับความยาว k ทั้งหมดจากตัวเลขตั้งแต่ 1 ถึง n ตามลำดับ
มาดูตัวอย่างเพื่อทำความเข้าใจหัวข้อ −
Input:k = 2 ; n = 3 Output: 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
ดังนั้นในปัญหานี้เราจึงต้องพิมพ์ลำดับตามที่ระบุไว้ข้างต้น
วิธีง่ายๆ ในการแก้ปัญหานี้คือการเพิ่มจำนวนเต็มของลำดับจนกว่าจะถึงค่าสูงสุด เช่น n ต่อไปนี้เป็นคำอธิบายโดยละเอียดของโซลูชัน
อัลกอริทึม
1) Create an array of size k with all values = 1 i.e. {1, 1, ..ktimes}.
2) Repeat step 3 and 4 till the array becomes {n, n, …, n}.
3) Print the array.
4) Increment the value such that the elements of the array become the next value. For example, {1, 1, 1} incremented to {1, 1, 2} and {1, 3, 3} incremented to {2, 1, 1}. For this we need to check the kth element of the array, if it’s equal to n become update, then check k-1 element in the sequence and so on for the same condition. ตัวอย่าง
โปรแกรมต่อไปนี้จะทำให้แนวคิดของคุณชัดเจนยิ่งขึ้น
#include<iostream>
using namespace std;
void printSequence(int arr[], int size){
for(int i = 0; i < size; i++)
cout<<arr[i]<<"\t";
cout<<endl;
return;
}
int nextElement(int arr[], int k, int n){
int s = k - 1;
while (arr[s] == n)
s--;
if (s < 0)
return 0;
arr[s] = arr[s] + 1;
for(int i = s + 1; i < k; i++)
arr[i] = 1;
return 1;
}
void generateSequence(int n, int k){
int *arr = new int[k];
for(int i = 0; i < k; i++)
arr[i] = 1;
while(1){
printSequence(arr, k);
if(nextElement(arr, k, n) == 0)
break;
}
return;
}
int main(){
int n = 3;
int k = 2;
cout<<"The sequence is :\n";
generateSequence(n, k);
return 0;
} ผลลัพธ์
ลำดับคือ −
1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
วิธีนี้เข้าใจง่ายแต่สามารถปรับปรุงให้ดีขึ้นและมีประสิทธิภาพมากขึ้นได้
วิธีนี้ใช้การเรียกซ้ำและดัชนีพิเศษเพื่อตรวจสอบลำดับออฟเซ็ต (ค่าหลังจากนั้นจะพลิกลำดับ) ฟังก์ชันจะถูกเรียกซ้ำและจะไม่อัปเดตเงื่อนไขจนถึงดัชนี และคืนค่าฟังก์ชันสำหรับเทอมถัดไปหลังดัชนี
ตัวอย่าง
#include<iostream>
using namespace std;
void printSequence (int arr[], int size){
for (int i = 0; i < size; i++)
cout << arr[i] << "\t";
cout << endl;
return;
}
void generateSequence (int arr[], int n, int k, int index){
int i;
if (k == 0){
printSequence (arr, index);
}
if (k > 0){
for (i = 1; i <= n; ++i){
arr[index] = i;
generateSequence (arr, n, k - 1, index + 1);
}
}
}
int main (){
int n = 3;
int k = 2;
int *arr = new int[k];
cout<<"The sequence is:\n";
generateSequence (arr, n, k, 0);
return 0;
} ผลลัพธ์
ลำดับคือ −
1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3