人狗鸡米过河问题matlab代码

这个还是笔者好久之前写的matlab代码,写的不是很好,还请大家多多在指正

clear;clc
South(1,:) = [1,1,1,1];   %南岸
North(1,:) = [0,0,0,0];   %北岸
A = ['人','狗','鸡','米'];
Safe_condition = [1,1,1,1;1,0,1,1;1,1,0,1;1,1,1,0;1,0,1,0;0,0,0,0;0,1,0,0;0,0,1,0;0,0,0,1;0,1,0,1]; %可行的状态
k = 0;                    %记录渡河次数
fprintf('渡河方式: \n');
while (~isequal(North(k+1,:),[1,1,1,1]))&&k<=100
    k = k+1;
    for i = 1:4
        flag1 = 0;flag2 = 0;flag3 = 1;  %防止死循环,以及出现不可行的状态
        if South(k,i) ==1
            Cross_river1 = [1,0,0,0];
            Cross_river1(i) = 1;
            South(k+1,:) = xor(South(k,:),Cross_river1);
            North(k+1,:) = [1,1,1,1] - South(k+1,:);
            for j = 1:10
                if isequal(North(k+1,:),Safe_condition(j,:))
                    flag1 = 1;
                end
            end
            for j = 1:10
                if isequal(South(k+1,:),Safe_condition(j,:))
                    flag2 = 1;
                end
            end
            for j = 1:k
                if isequal(South(k+1,:),South(j,:))
                    flag3 = 0;           %防止出现状态死循环
                end
            end
            if (flag1 ==1)&&(flag2 ==1)&&(flag3 ==1)
                if i ==1
                    fprintf('%s 从南岸到北岸\n',A(1));
                    break
                else
                    fprintf('%s 和  %s 从南岸到北岸\n',A(1),A(i));
                    break
                end
            else
                continue
            end
        end
    end
    if isequal(North(k+1,:),[1,1,1,1])
        break
    else
        k = k+1;
        for m = 1:4
            flag1 = 0;flag2 = 0;flag3 = 1;
            if North(k,m) ==1
                Cross_river2 = [1,0,0,0];
                Cross_river2(m) = 1;
                North(k+1,:) = xor(North(k,:),Cross_river2);
                South(k+1,:) = [1,1,1,1] - North(k+1,:);
                for j = 1:10
                    if isequal(North(k+1,:),Safe_condition(j,:))
                        flag1 = 1;
                    end
                end
                for j = 1:10
                    if isequal(South(k+1,:),Safe_condition(j,:))
                        flag2 = 1;
                    end
                end
                for j = 1:k
                    if isequal(South(k+1,:),South(j,:))
                        flag3 = 0;           %防止出现状态死循环
                    end
                end
                if (flag1 ==1)&&(flag2 ==1)&&(flag3 ==1)
                    if m ==1
                        fprintf('%s 从北岸到南岸\n',A(1));
                        break
                    else
                        fprintf('%s 和  %s 从北岸到南岸\n',A(1),A(m));
                        break
                    end
                else
                    continue
                end
            end
        end
    end
end
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值