برنامه حل سودوکو با متلب

antanidas110

عضو جدید
سلام دوستان عزیز
این برنامه حل سودوکو.با توضیحات توی file main.m برنامرو run کنید
راستی اگه ایده ای داشتید برا برنامه نویسی خوشحال میشم با هام در میون بزارید.
;);)
 

پیوست ها

  • SUDOKU.rar
    4.3 کیلوبایت · بازدیدها: 0

nikipedia

عضو جدید
سلام دوستان عزیز
این برنامه حل سودوکو.با توضیحات توی file main.m برنامرو run کنید
راستی اگه ایده ای داشتید برا برنامه نویسی خوشحال میشم با هام در میون بزارید.
;);)


در مورد الگوریتم برنامه توضیح می دهید؟
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
Simple Recursive Solver

Simple Recursive Solver

یه روش ساده تر:
کد:
function A=sudoku(A)
% SUDOKU Simple Recursive Solver, 2005
% http://mmnrecipes.blogspot.com
[yy,xx]=find(A==0);
if isempty(xx)
    disp('solution')
    return
end
x=xx(1);y=yy(1);
for i=1:9
    y1=1+3*floor((y-1)/3);
    x1=1+3*floor((x-1)/3);
    if ~(any(A(y,:)==i)||any(A(:,x)==i)||any(any(A(y1:y1+2,x1:x1+2)==i)))
        tmp=A; tmp(y,x)=i; tmp=sudoku(tmp);
        if all(all(tmp))
            A=tmp;
            return
        end
    end
end

نمونه:
کد:
%% Sample use of SUDOKU function
a=[3 0 0 0 0 4 9 0 0
   9 4 7 0 0 0 8 0 0
   0 8 0 0 0 1 0 5 0
   0 0 5 1 0 3 0 0 0
   0 0 9 0 0 2 0 0 0
   0 0 0 4 9 0 0 0 5
   0 0 0 0 0 0 5 0 0
   0 0 6 0 0 9 4 3 0
   0 2 0 6 0 0 0 8 0];


tic
S=sudoku(a)
toc

این هم خروجی:
کد:
solution


S =


     3     5     1     7     8     4     9     2     6
     9     4     7     2     6     5     8     1     3
     6     8     2     9     3     1     7     5     4
     4     6     5     1     7     3     2     9     8
     7     3     9     8     5     2     6     4     1
     2     1     8     4     9     6     3     7     5
     1     9     4     3     2     8     5     6     7
     8     7     6     5     1     9     4     3     2
     5     2     3     6     4     7     1     8     9


Elapsed time is 0.955149 seconds.
 

senarius

عضو جدید
یه روش ساده تر:
کد:
function A=sudoku(A)
% SUDOKU Simple Recursive Solver, 2005
% http://mmnrecipes.blogspot.com
[yy,xx]=find(A==0);
if isempty(xx)
    disp('solution')
    return
end
x=xx(1);y=yy(1);
for i=1:9
    y1=1+3*floor((y-1)/3);
    x1=1+3*floor((x-1)/3);
    if ~(any(A(y,:)==i)||any(A(:,x)==i)||any(any(A(y1:y1+2,x1:x1+2)==i)))
        tmp=A; tmp(y,x)=i; tmp=sudoku(tmp);
        if all(all(tmp))
            A=tmp;
            return
        end
    end
end

نمونه:
کد:
%% Sample use of SUDOKU function
a=[3 0 0 0 0 4 9 0 0
   9 4 7 0 0 0 8 0 0
   0 8 0 0 0 1 0 5 0
   0 0 5 1 0 3 0 0 0
   0 0 9 0 0 2 0 0 0
   0 0 0 4 9 0 0 0 5
   0 0 0 0 0 0 5 0 0
   0 0 6 0 0 9 4 3 0
   0 2 0 6 0 0 0 8 0];


tic
S=sudoku(a)
toc

این هم خروجی:
کد:
solution


S =


     3     5     1     7     8     4     9     2     6
     9     4     7     2     6     5     8     1     3
     6     8     2     9     3     1     7     5     4
     4     6     5     1     7     3     2     9     8
     7     3     9     8     5     2     6     4     1
     2     1     8     4     9     6     3     7     5
     1     9     4     3     2     8     5     6     7
     8     7     6     5     1     9     4     3     2
     5     2     3     6     4     7     1     8     9


Elapsed time is 0.955149 seconds.
واقعا روشتون جالبه,ولی من تابع برگشتی کار نکرده بودم,برا همین اینطوری نوشتم.
من چند تا سوال ازتون دارم ,چه طور میتونم با هاتون صحبت کنم؟
 

senarius

عضو جدید
در مورد الگوریتم برنامه توضیح می دهید؟
خوب من خودمو یه کاربر تصور کردم که می خواد یک سودوکو حل کنه,همون کارهایی رو که اون انجام میده رو نوشتم.با این تفاوت که وقتی به مرحله ای می رسیم که جز حدس راهی نداریم,احتمال های دوتایی را انتخاب کرده,و اگر به اررور برخوردیم ,دومین احتمال را انتخاب می کنیم
 

senarius

عضو جدید
یه روش ساده تر:
کد:
function A=sudoku(A)
% SUDOKU Simple Recursive Solver, 2005
% http://mmnrecipes.blogspot.com
[yy,xx]=find(A==0);
if isempty(xx)
    disp('solution')
    return
end
x=xx(1);y=yy(1);
for i=1:9
    y1=1+3*floor((y-1)/3);
    x1=1+3*floor((x-1)/3);
    if ~(any(A(y,:)==i)||any(A(:,x)==i)||any(any(A(y1:y1+2,x1:x1+2)==i)))
        tmp=A; tmp(y,x)=i; tmp=sudoku(tmp);
        if all(all(tmp))
            A=tmp;
            return
        end
    end
end

نمونه:
کد:
%% Sample use of SUDOKU function
a=[3 0 0 0 0 4 9 0 0
   9 4 7 0 0 0 8 0 0
   0 8 0 0 0 1 0 5 0
   0 0 5 1 0 3 0 0 0
   0 0 9 0 0 2 0 0 0
   0 0 0 4 9 0 0 0 5
   0 0 0 0 0 0 5 0 0
   0 0 6 0 0 9 4 3 0
   0 2 0 6 0 0 0 8 0];


tic
S=sudoku(a)
toc

این هم خروجی:
کد:
solution


S =


     3     5     1     7     8     4     9     2     6
     9     4     7     2     6     5     8     1     3
     6     8     2     9     3     1     7     5     4
     4     6     5     1     7     3     2     9     8
     7     3     9     8     5     2     6     4     1
     2     1     8     4     9     6     3     7     5
     1     9     4     3     2     8     5     6     7
     8     7     6     5     1     9     4     3     2
     5     2     3     6     4     7     1     8     9


Elapsed time is 0.955149 seconds.
میشه در مورد الگوریتمش توضیح بدید
 

pa_abbaspour

عضو جدید
سلام . من میخواستم یک الگوریتم برای مجیک مثلث خیام به زبان برنامه نویسی متلب بنویسم . میشه کمک کنیییییییید؟
 

Similar threads

بالا