作业帮 > 综合 > 作业

一些关于计算机数学,MATLAB的问题.

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/04/26 17:21:34
一些关于计算机数学,MATLAB的问题.
圆桌吃饭问题,有6个人围着一张圆桌吃饭,
1:编写MATLAB程序,找出所有不同的做法,并把每种做法的作为矩阵的一行(提示:吧6哥人视为图G的6个节点,由于每两个人可以相邻,即每两个节点都是相邻的,故图G是6个节点的完全图,每一种做法是图G的一条哈密尔顿回路)
2:运行程序,并写出前5种不同的做法,再用size函数要求共有多少种不同的做法.
3:若第一个人于第三个人,第二个人与第四个人,第三个人与第六个人不能相邻,编写MATLAB程序,找出所有不同的做法(提示:既在图G种去掉边{1,3},{3,1},{2,4},{4,2},{3,6},{6,3}可以只写出主程序,被调用的函数不变
4:运行程序,并写出所有不同的做法.
6*5*4*3*2*1/6=120种方法 对吧 (n-1)!
用穷举法 做就可以 反正人少 再把 3中不符合的 剔除掉
clc
clear
P(1,6)=0;ll=0;
n=6;
n_1=prod(1:n);
allorder_K=zeros(1,n-1);
tic
for allorder_m=1:n_1 %产生n!个排列
allorder_flag=zeros(1,n);
allorder_P=zeros(1,n);
for allorder_i=1:n-1
position=n-allorder_K(allorder_i);
allorder_j=n;
while(allorder_j>=position)
if (allorder_flag(allorder_j)==1)
position=position-1;
end
allorder_j=allorder_j-1;
end
allorder_P(position)=n+1-allorder_i;
allorder_flag(position)=1;
end
for allorder_i=1:n
if (allorder_flag(allorder_i)==0)
allorder_P(allorder_i)=1;
break;
end
end
%%%%以下更新K
for allorder_i=1:n-1
allorder_K(n-allorder_i)=mod(allorder_K(n-allorder_i)+1,allorder_i+1);
if (allorder_K(n-allorder_i)~=0)
break;
end
end
%%%下面,可以引用allorder_P进行相关处理
ll=ll+1;
P(ll,:)=allorder_P;
end
toc
for i=1:120
res(i,:)=P(1,:);
res1=res(i,:);
for j=1:6
res1=[res1(6) res1(1:5)];
for k=1:length(P(:,1))
if P(k,:)==res1
P(k,:)=0;
end
end
end
P(find(P(:,1)==0),:)=[];
end
res(1:5,:)