爸爸 妈妈 猎人和狗 有两男孩 两个女孩 。他们要过河,但猎人不在的时候,狗咬任何人,当爸爸不在的时候,妈妈打小男孩,妈妈不在的时候,爸爸打小女孩,他们怎么过去

本文主要是介绍爸爸 妈妈 猎人和狗 有两男孩 两个女孩 。他们要过河,但猎人不在的时候,狗咬任何人,当爸爸不在的时候,妈妈打小男孩,妈妈不在的时候,爸爸打小女孩,他们怎么过去,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

爸爸 妈妈 猎人和狗 有两男孩 两个女孩 。他们要过河,但猎人不在的时候,狗咬任何人,当爸爸不在的时候,妈妈打小男孩,妈妈不在的时候,爸爸打小女孩,他们怎么过去

 

有一天看到的一个网上题目,一时兴起便写了一下,o(^▽^)o

#include<stdio.h>#define N 10// 爸 妈 猎人 狼 两个儿子 两个女儿int dp[2][1<<N];
int path[2][1<<N];
int vis[2][1<<N];int ok(int cur)
{if((cur&(1<<0))&&((cur&(1<<6))||(cur&(1<<7)))&&!(cur&(1<<1))) return 0;if((cur&(1<<1))&&((cur&(1<<4))||(cur&(1<<5)))&&!(cur&(1<<0))) return 0;if((cur&(1<<3))&&!(cur&(1<<2))&&(cur^(1<<3))) return 0;return 1;
}int get_num(int x)
{int ans=0;while(x){ans++;x&=(x-1);}return ans;
}void print(int cur)
{if(cur&(1<<0)) printf("爸爸 ");if(cur&(1<<1)) printf("妈妈 ");if(cur&(1<<2)) printf("猎人 ");if(cur&(1<<3)) printf("狼 ");if(cur&(1<<4)) printf("儿子1 ");if(cur&(1<<5)) printf("儿子2 ");if(cur&(1<<6)) printf("女儿1 ");if(cur&(1<<7)) printf("女儿2 ");printf("\n");}void show(int side,int cur)
{int i,j;if((cur&path[side][cur])==0) return ;int all=(1<<8)-1;show(side^1,path[side][cur]);if(side) printf("去: ");else printf("来: ");print(cur&path[side][cur]);
}int dfs(int side,int cur)
{if(vis[side][cur]) return 0;vis[side][cur]=1;int all=(1<<8)-1;if(side==1&&cur==all) return 1;if(dp[side][cur]!=-1) return dp[side][cur];for(int to=1;to<=all;to++){if((cur&to)!=to) continue;int num=get_num(to);if(num>2) continue;if(!(to&(1<<0))&&!(to&(1<<1))&&!(to&(1<<2))) continue;if(!ok(to)) continue;if(!ok(cur^to)) continue;if(!ok(all^(cur^to))) continue;if(dfs(side^1,all^(cur^to))){path[side^1][all^cur^to]=cur;return dp[side][cur]=1;}}return dp[side][cur]=0;
}int main()
{int i,j;for(i=0;i<(1<<N);i++) dp[0][i]=dp[1][i]=-1;for(i=0;i<(1<<N);i++){vis[0][i]=vis[1][i]=0;path[0][i]=path[1][i]=0;}printf("%d\n",dfs(0,(1<<8)-1));show(1,(1<<8)-1);return 0;
}

这篇关于爸爸 妈妈 猎人和狗 有两男孩 两个女孩 。他们要过河,但猎人不在的时候,狗咬任何人,当爸爸不在的时候,妈妈打小男孩,妈妈不在的时候,爸爸打小女孩,他们怎么过去的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/254004

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

LinuxMint怎么安装? Linux Mint22下载安装图文教程

《LinuxMint怎么安装?LinuxMint22下载安装图文教程》LinuxMint22发布以后,有很多新功能,很多朋友想要下载并安装,该怎么操作呢?下面我们就来看看详细安装指南... linux Mint 是一款基于 Ubuntu 的流行发行版,凭借其现代、精致、易于使用的特性,深受小伙伴们所喜爱。对

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换