بسم الله الرحمن الرحیم
چون مرحله ی بعدی المپیاد کامپیوتر در پیشه و احتمالا سوال هایی که در این مرحله داده خواهد شد اکثرا به backtrack احتیاج خواهند داشت تصمیم گرفتم این مطلب مهم رو با حل یک سوال بسیار ساده شروع کرده و ان شا الله در روز های آینده سوال هایی شبیه سوال های سال پیش را حل کنم
در این روش کل حالات ممکن چک میشود و حالات مطلوب جدا میشوند ، البته بعدا برای بهتر شدن سرعت برنامه و الگوریتم مورد نظر یک سری از حالاتی که امکان ندارد درست باشند را از اول چک نمیکنیم.
اکثر برنامه های backtrack به صورت بازگشتی نوشته میشوند
حال آموزش را با یک مثال شروع میکنیم:
در این روش کل حالات ممکن چک میشود و حالات مطلوب جدا میشوند ، البته بعدا برای بهتر شدن سرعت برنامه و الگوریتم مورد نظر یک سری از حالاتی که امکان ندارد درست باشند را از اول چک نمیکنیم.
اکثر برنامه های backtrack به صورت بازگشتی نوشته میشوند
حال آموزش را با یک مثال شروع میکنیم:
برنامه ای بنویسید که از ورودی n را خوانده و تمام اعداد باینری n رقمی را کع تعداد آنها 2 به توان n تا میاشد را چاپ کند.برای مثال برای n=2 جواب میشود:
00 و 01 و 10 و 11
00 و 01 و 10 و 11
کدآنرا در زیر قرار میدهم و توضیحاتی نیز بر آن میدهم در صورتی که سوالی داشتین حتما بپرسین
کد
[LIST=1]
[*]#include<iostream>
[*]using namespace std;
[*]const int N=1000 + 10;
[*]int arr[N];
[*]int n;
[*]void bt(int cnt){
[*] if(cnt==n){
[*] for(int i=0;i<n;i++)
[*] cout<<arr[i];
[*] cout<<endl;
[*] return;
[*] }
[*] arr[cnt]=0;
[*] bt(cnt+1);
[*] arr[cnt]=1;
[*] bt(cnt+1);
[*] arr[cnt]=0;
[*]}
[*]int main(){
[*] cin>>n;
[*] bt(0);
[*]}
[/LIST]
برای تمرین شما برنامه ای بنویسید که n را از ورودی بگیرد و تعداد حالات قرار دادن n رخ را در صفحه n*n شطرنج به طریقی که این n رخ همدیگر را تهدید نکنند را در خروجی چاپ کند ، در دفعه بعد ان شا الله جواب این مساله را خواهم گذاشت
پیوست ها
-
9.2 کیلوبایت بازدیدها 26