Computer >> Máy Tính >  >> Lập trình >> C ++

Đếm các sắp xếp (Hoán vị sao cho không có phần tử nào xuất hiện ở vị trí ban đầu của nó) trong C ++

Sự sắp xếp là hoán vị của N số sao cho không có số nào xuất hiện ở vị trí ban đầu. Ví dụ, một sự sắp xếp có thể có của {1,2,3} là {2,1,3}. Không có phần tử nào trong cái này ở vị trí ban đầu của nó. Mục tiêu ở đây là đếm số lần sắp xếp có thể xảy ra cho N số.

Chúng tôi sẽ làm điều này bằng cách sử dụng một giải pháp đệ quy. Đối với sau không. trong số các phần tử -

  • N =0, không có sự sắp xếp, trả về 1
  • N =1, chỉ một số, trả về 0
  • N =2, chỉ có thể hoán đổi vị trí một lần, {1,2} → {2,1}, trả về 1
  • N =3, 2 hoán vị có thể có, ví dụ:{1,2,3} → {2,3,1}, {3,1,2} đếm 2
  • N =4, 9 hoán vị có thể có
  • .......................
  • N, (N-1) * (hoán vị (N-1) + hoán vị (N-2))

Đối với tất cả các phần tử trong một mảng,

  • Phần tử ở chỉ mục 0 có n-1 vị trí mà nó có thể đảm nhận,

  • Nếu bất kỳ phần tử nào ở chỉ mục i được đặt ở chỉ mục 0 thì arr [i] và arr [0] được đổi chỗ cho nhau. Bây giờ có n-2 nguyên tố để tính toán.

  • Nếu phần tử ở chỉ mục i không được đặt ở chỉ mục 0 thì đối với n-1 phần tử có n-2 lựa chọn.

Sơ đồ

Đếm các sắp xếp (Hoán vị sao cho không có phần tử nào xuất hiện ở vị trí ban đầu của nó) trong C ++

Đầu vào

Arr[] = { 1, 2 }

Đầu ra

No. of derangements : 1

Giải thích - Vị trí 1 và 2 là chỉ số 0 và 1. Chỉ vị trí họ có thể nhận được là hoán đổi vị trí ban đầu. {2,1}

Đầu vào

Arr[] = { 1, 2, 3 }

Đầu ra

No. of derangements : 2

Giải thích - Vị trí 1,2 và 3 là chỉ số 0,1,2.

1 có thể được đặt ở chỉ số 1 và 2, 2 có thể được đặt ở chỉ số 0 và 3 và 3 có thể được đặt ở chỉ số 0 và 1.

{2,3,1} và {3,1,2} là 2 biến vị.

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Số nguyên lưu trữ số lượng các số hiện có.

  • Hàm đệ quy derangements (int N) lấy số đếm làm đầu vào và trả về số không. của sự thay đổi.

  • Các câu lệnh trả về cho N =0,1,2 đang xử lý các trường hợp cơ sở mà các hoán vị đã được tính là 1,0 và 1.

  • Khi N> 2 thì lệnh gọi đệ quy tới derangements () được thực hiện bằng công thức,

    (N-1) * (derangements (N-1) + derangements (N-2)).

Khi bắt đầu theo dõi ngược, số lượng sẽ được tính toán và trả về.

Ví dụ

#include <bits/stdc++.h>
using namespace std;
int derangements(int N){
   if (N == 0)
      return 1;
   if (N == 1)
      return 0;
   if (N == 2)
      return 1;
   return (N - 1) * (derangements(N - 1) + derangements(N - 2));
}
int main(){
   int Numbers=5;
   cout<<"Number of Derangements :"<<derangements(Numbers);
}

Đầu ra

Number of Derangements :44