商人過河問題: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.當盤...