商人過河問題 n個 Matlab

2021-08-20 16:10:49 字數 2271 閱讀 4491

商人過河問題:n名商人各帶一名隨從過河,乙隻小船只能容納z個人,隨從們約定,只要在河的任何一岸,一旦隨從人數多於商人人數就殺人越貨,但是商人們知道了他們的約定,並且如何過河的大權掌握在商人們手中,商人們該採取怎樣的策略才能安全過河並且渡河次數最少呢??

先從一般的例子開始討論,通過3名商人各帶一名隨從過河,乙隻小船只能容納3個人,從此岸的角度確定安全矩陣。再遞推,確定n名商人各帶一名隨從過河,乙隻小船只能容納z個人的安全狀態矩陣(0、1)的規律

然後分類討論,設立判定條件,來討論什麼情況下不存在安全過河狀態以及對安全矩陣的遍歷,通過設定單元陣列來儲存渡河所有過程,以便於後續查詢和判斷

最後通過判斷此岸商人、僕人是否都已經到達彼岸來選擇出最少渡河次數,並輸出一組結果;如果不存在安全到達的情況則輸出no answer!

:對於不同情況的m、z只需要修改**中的m、z即可。

% matlab

clear;

home;

m=3; %商人、僕人數

z=3; %船上可載人數

m=m+1; %矩陣中不存在0位置

a=zeros(m); %列表示商人,行表示僕人

for i=0:m-1 %尋找安全狀態,1為安全,0為不安全

for j=0:m-1

if (i==j)||(i==m-1)||(i==0)

a(i+1,j+1)=1;

endend

ends={}; %用來存放路徑

p=1; %用來表示放在每一行的第幾列

r=; %特殊情況

s=[m,m,1]; %[a,b,c]a表示此岸商人數,b表示此岸僕人數,c表示由上面情況c推的

for t=1:100 %迴圈上界適當

flag=0; %用來判斷是否重複

trump=0; %用來判斷是否已經存在可安全渡河的情況

k=t; %k表示渡河次數

if z>=2*(m-1) %當船載人數大於或等於總人數

k=1

r=[m-1,m-1;0,0]

break;

end

for a=1:sum(~cellfun(@isempty, s(k,:))) %表示有幾種情況(相對於同乙個k來說)

if a==1 %第一種情況,從第乙個列開始存

p=1;

endn1=s(1,1); %賦值,商人數

n2=s(1,2); %賦值,僕人數

for i=0:z %渡河

for j=0:z

if (i+j>=1 && i+j<=z) && (n1+i*(-1)^k<=m && n1+i*(-1)^k>=1) && (n2+j*(-1)^k<=m && n2+j*(-1)^k>=1) && (a(n1+i*(-1)^k,n2+j*(-1)^k)==1)

%條件判斷

if k>=2 %判斷是否重複

for e=1:sum(~cellfun(@isempty, s(k-1,:)))

if (s(1,1)==n1+i*(-1)^k) && (s(1,2)==n2+j*(-1)^k)

flag=1; %如果發現重複,則flag==1

break;

endend

endif flag==0 %不重複存入

s=[n1+i*(-1)^k,n2+j*(-1)^k,a];

p=p+1;

endflag=0; %每一次判斷之後flag都要歸0

endend

endend

k=k+1; %一次考慮完後k+1

s=; %往下建立空cell

if sum(~cellfun(@isempty, s(k,:)))==0 %判斷是否有新的情況生成,0表示s全部為空

'no answer!'

break;

endfor win=1:sum(~cellfun(@isempty, s(k,:))) %判斷是否已有完成任務的情況

if s(1,1)==1 && s(1,2)==1

trump=1;

break;

endend

if trump==1

k=k-1

break;

endendif trump==1 %輸出一組結果

w=;qq=win;

for oo=1:k+1

w(oo,1)=s(1,1)-1;

w(oo,2)=s(1,2)-1;

qq=s(1,3);

endw=flipud(w)

end

《第一次寫部落格》ヽ(○^㉨^)ノ♪ 

翻轉n個硬幣的問題

今天去面試,面試官問了我這樣乙個問題,當時答的很近了,但是還差一點,最後還是被pass了 原題是這樣 一堆硬幣有n個,都是朝下的,翻轉n次,第一次翻轉能被1整除的,第2次翻轉能被2整除的,第三次翻轉能被3整除的,這樣直到第n次翻轉能被n整除的,問最後朝上的是多少個?思路很簡單,就怕你想不到 第i次翻...

N個加油站問題

問題 城市的環形路有n個加油站,第i個加油站的油量用gas i 來表示,你有如下的一輛車 它的油缸是無限量的,初始是空的 它從第i個加油站到第i 1個加油站消耗油量為cost i 現在你可以從任意加油站開始,路過加油站可以不斷的加油,問是否能夠走完環形路。如果可以返回開始加油站的編號,如果不可以返回...

m個蘋果放入n個盤子問題

題目 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。輸入每個用例包含二個整數m和n。0 m 10,1 n 10。0 n 10 m 10 解題思路 我們首先定義dp i j 表示i個蘋果,j個盤子的分法總數 1.當盤...