PDA

View Full Version : ترکیب و جایگشت



Amir Ali
جمعه 20 خرداد 1384, 20:39 عصر
چه طوری میشه برنامه ای نوشت که :
با دریافت یک رشته تمام جایگشتهای اونو چاپ کنه مثلا با دریافت :ABC این خروجی رو روی مانیتور چاپ کنه :
ABC
ACB
BAC
BCA
CAB
CBA
به طور کلی برای n کاراکتر ورودی باید !n جمله در خروجی چاپ شود. در ضمن باید با یک تابع خود فراخوان نوشته شود .

Inprise
جمعه 20 خرداد 1384, 22:43 عصر
- از عناوین مناسب برای طرح سوالاتت استفاده کن
- ترکیب و جایگشت قبلا" مطرح و کدهای متعددی براشون ارائه شده . فروم رو جستجو کن

Amir Ali
جمعه 27 خرداد 1384, 08:36 صبح
- من متوجه منظور شما نمیشم.
- اگه قبلا جایی این بحث مطرح شده آدرسشو بنویسید .

imi
سه شنبه 31 خرداد 1384, 05:05 صبح
سلام
با عرض معذرت. من در این مدت امتحان داشتم و وقت نبود که حالت کلی را بنویسم. به هر حال اگر هنوز برایت مهم است بگو تا بفرستمش.

Amir Ali
سه شنبه 31 خرداد 1384, 15:46 عصر
کجا بودی بابا ؟
آره به شدت بهش نیاز دارم فقط سریع و کامل باشه
با تابع بازگشتیها!!!
ممنون
:flower:

imi
چهارشنبه 01 تیر 1384, 07:56 صبح
/*
Program:jaygasht(N!)
Programmer:IMI-LOLO 1384/4/1
*/
#include <stdio.h>
#include <conio.h>
void imi(int,int);
char b[100];
int a[100];
void main()
{
clrscr();
printf("enter a string:");
for(int n=0;(b[n]=getche())!='\r';n++);
printf("\n**********\n");
int t=1;
imi(t,n);
getch();
}
//******
void imi(int t,int n)
{
int test;
for(a[t-1]=0;a[t-1]<n;a[t-1]++)
if(t!=n)
imi(t+1,n);
else
{//write your code{
test=1;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
if(b[a[i]]==b[a[j]]&&i!=j)test=0;
if(test)
{
for(i=0;i<n;i++)
printf("%c",b[a[i]]);
printf("\t");
}
//}
}
}
امیدوارم به دردت بخوره.
برای شلوغ نشدن پارامتر ها و آرگومان ها از متغیر عمومی استفاده کردم. این برنامه برای رشته هایی به طول 100 کاراکتر و کمتر است که تعمیم دادن اون خیلی آسونه. مثلا اگه می خواهی برای رشته هایی به طول 1000000 و کمتر جواب بده کافیه دو تا عدد 100 رو به 1000000 یا هر چی خواستی تغییر بدی. منظورم اندیس آرایه هایی که بالای تابع main تعریف شدن.
موفق باشی.

Amir Ali
جمعه 03 تیر 1384, 19:22 عصر
خیلی خیلی ممنون فقط تنها مشکلی که هست اینه که رشته های که توشون کاراکتر تکراری هست جواب نمیده
:wink:

imi
شنبه 04 تیر 1384, 11:04 صبح
فکر کنم چند مورد را باید یاد آوری کنم.
1-
به طور کلی برای n کاراکتر ورودی باید !n جمله در خروجی چاپ شود.
همان طور که خودتان گفته اید باید !n در خروجی چاپ شود و برای رشته هایی که کاراکتر تکراری دارند جواب !N نمی شود بلکه !n تقسیم بر !(تعداد کاراکتر از نوع اول) * !(تعداد کاراکتر از نوع دوم) * .... می شود. پس از حرف شما نتیجه می شود که رشته هایی با کاراکتر های متمایز مورد نظر شما بوده است.

2- اگر برنامه را هم برای رشته هایی با حرف های یکسان و هم برای رشته هایی با حرف های مختلف می خواهی ، شرط b[a[i]]==b[a[j]]&&i!=j را به a[i]==a[j]&&i!=j تغییر بده و بعد خودت یک آرایه دو بعدی درست کن و ابتدا رشته های به دست آمده را درون آن بگذار و آن هایی را که تکراری اند حذف کن. سپس آرایه را چاپ کن.

توجه کن که فقط با تغییر شرط هم برنامه برای هر دو مورد کار می کند ولی برای مورد اول چند رشته مشابه را هم چاپ می کند.

3- همان طور که می دانی چون ساده ترین روش برای این کار استفاده شده برای رشته هایی با طول زیاد مثل 10 به بالا زمان زیادی برای اتمام برنامه مورد نیاز است که برای روفع این مشکل باید الگوریتمش بهینه شود.

Amir Ali
دوشنبه 06 تیر 1384, 06:45 صبح
بازم از لطفت ممنون
:موفق:

imi
دوشنبه 06 تیر 1384, 19:22 عصر
خواهش می کنم. :)

فرنازبیک زاده
جمعه 10 آذر 1391, 13:29 عصر
میشه لطفا کدشو بذارید؟ کد++c