一、题目

  使用递归算法和二维数组,根据下面条件排序上面的对象。

  五个人 张三 李四 王五 猴六 麻七
  五间房子 黄房子 蓝房子 红房子 绿房子 橙房子
  五只宠物 蜗牛 小狗 小猫 小白兔 小金鱼
  五个饮料 水 茶 牛奶 果汁 咖啡
  五个食物 圆葱 香蕉 苹果 蘑菇 蛋糕

  张三住在红门的房子里
  喝牛奶的住在中间房子里
  猴六有只小猫,邻居有只小金鱼
  麻七住在最左边的房子里
  住在绿房子里的喝咖啡
  吃圆葱的住在吃苹果的右边
  王五喝茶还有只小狗
  吃蛋糕的喝果汁
  绿房子在最右边,橙色房子在其左边
  吃苹果的邻居有只小狗
  吃蘑菇的有一只小蜗牛。
  猴六吃香蕉
  住在黄房子里的吃苹果
  麻七的邻居的房子是蓝色的

  谁喝水?麻七
  谁有只小金鱼?李四

二、解题思路

  正确答案如下:

    

  回溯加剪枝。

三、代码

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Test04
{
class Program
{
/*int[,] arr = new int[5, 6] {
{4, 2, 0, 1, 3, -1},
{0, 1, 2, 4, 3, -1},
{3, 1, 0, 4, 2, -1},
{0, 1, 2, 3, 4, -1},
{2, 0, 3, 4, 1, -1}
};*/
int[,] arr = new int[, ]; // 存储五个对象
bool[,] flag = new bool[, ]; // 标记是否已用
// 对象名称
string[] people = new string[] { "张三", "李四", "王五", "猴六", "麻七" };
string[] house = new string[] { "黄房子", "蓝房子", "红房子", "绿房子", "橙房子" };
string[] pet = new string[] { "蜗牛", "小狗", "小猫", "小白兔", "小金鱼" };
string[] drink = new string[] { "水", "茶", "牛奶", "果汁", "咖啡" };
string[] food = new string[] { "圆葱", "香蕉", "苹果", "蘑菇", "蛋糕" }; // 在第 m 行寻找值为 k 的对象
int find(int m, int k)
{
for (int i = ; i < ; ++i)
{
if (arr[m, i] == k) // 找到
{
return i;
}
}
return -; // 没找到
} /*bool check()
{
int p = find(0, 0);
if (arr[1, p] != 2) return false; // 2
p = find(3, 2);
if (p != 2) return false; // 4
p = find(0, 3);
if (arr[2, p] != 2 || ((p > 0 && arr[2, p - 1] != 4) && arr[2, p + 1] != 4)) return false; // 3
p = find(0, 4);
if (p != 0 || ((p > 0 && arr[1, p - 1] != 1) && arr[1, p - 1] != 1)) return false; // 2
p = find(1, 3);
if (arr[3, p] != 4) return false; // 4
p = find(4, 2);
if (arr[4, p + 1] != 0) return false; // 5
p = find(0, 2);
if (arr[3, p] != 1 || arr[2, p] != 1) return false; // 4
p = find(4, 4);
if (arr[3, p] != 3) return false; // 5
if (arr[1, 3] != 4 || arr[1, 4] != 3) return false; // 2
p = find(4, 2);
if ((p>0 && arr[2, p - 1] != 1) && arr[2, p + 1] != 1) return false; // 5
p = find(4, 3);
if (arr[2, p] != 0) return false; // 5
p = find(0, 3);
if (arr[4, p] != 1) return false; // 5
p = find(1, 0);
if (arr[4, p] != 2) return false; // 5
return true;
}*/ // 产生每一种情况,适当剪枝,判断是否满足情况
void dfs(int n)
{
int p = ;
if (n == )
{
// 张三住在红门的房子里
p = find(, );
if (arr[, p] != ) return;
p = find(, );
// 麻七住在最左边的房子里
// 麻七的邻居的房子是蓝色的
if (p != || ((p > && arr[, p - ] != ) && arr[, p + ] != )) return;
// 绿房子在最右边,橙色房子在其左边
if (arr[, ] != || arr[, ] != ) return;
}
else if (n == )
{
// 猴六有只小猫,邻居有只小金鱼
p = find(, );
if (arr[, p] != || ((p > && arr[, p - ] != ) && arr[, p + ] != )) return;
}
else if (n == )
{
// 喝牛奶的住在中间房子里
p = find(, );
if (p != ) return;
// 住在绿房子里的喝咖啡
p = find(, );
if (arr[, p] != ) return;
// 王五喝茶还有只小狗
p = find(, );
if (arr[, p] != || arr[, p] != ) return;
}
else if (n == )
{
// 吃蛋糕的喝果汁
p = find(, );
if (arr[, p] != ) return;
// 吃圆葱的住在吃苹果的右边
p = find(, );
if (arr[, p + ] != ) return;
// 吃苹果的邻居有只小狗
if ((p > && arr[, p - ] != ) && arr[, p + ] != ) return;
// 吃苹果的邻居有只小狗
p = find(, );
if (arr[, p] != ) return;
// 猴六吃香蕉
p = find(, );
if (arr[, p] != ) return;
// 住在黄房子里的吃苹果
p = find(, );
if (arr[, p] != ) return;
/*for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{
Console.Write(arr[i, j]);
}
Console.Write('\n');
}*/
p = find(, );
Console.Write("谁喝水?");
Console.WriteLine(people[arr[, p]]); // 打印谁喝水
p = find(, );
Console.Write("谁有小金鱼?"); // 打印谁有小金鱼
Console.WriteLine(people[arr[, p]]); return;
}
for (int i = ; i < ; ++i)
{
if (!flag[n / , i])
{
arr[n / , n % ] = i;
flag[n / , i] = true;
dfs(n + );
flag[n / , i] = false;
}
} } static void Main(string[] args)
{
Program p = new Program();
p.dfs(); // 回溯
Console.Read();
}
}
}

四、运行截图

  

C#基础编程试题 4的更多相关文章

  1. 经典的Java基础面试题集锦

    经典的Java基础面试题集锦,欢迎收藏和分享. 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”. 问题:Java里的传引用 ...

  2. Android开发面试经——3.常见Java基础笔试题

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

  3. Android开发面试经——2.常见Android基础笔试题

     标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报  分类: Android开发(29)  版 ...

  4. 前端基础面试题(JS部分)

    1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String 值类型:数值.布尔值.null.und ...

  5. 100道Java基础面试题收集整理(附答案)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

  6. iOS一些基础面试题

    Part One 别人问你你都感觉这尼玛说啥的基础面试题 1.UIWindow和UIView和 CALayer 的联系和区别? 答:UIView是视图的基类,UIViewController是视图控制 ...

  7. 一份最贴近真实面试的Java基础面试题

    这是一份Java基础知识的面试题.在网上的关于Java的面试题数不胜数,但认真看过感觉大多数都没有实用性,有很多是面试官根本就不会问到的,那些已经脱离了实际开发的技术问题.而这份资料来源自一份个人觉得 ...

  8. 最新28道java基础面试题-上

    28道java基础面试题 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪 ...

  9. 28道java基础面试题-下

    28道java基础面试题下 15.Java语言如何进行异常处理,关键字:throws.throw.try.catch.finally分别如何使用? 答:Java通过面向对象的方法进行异常处理,把各种不 ...

随机推荐

  1. 浅析Java虚拟机结构与机制

    转载自:http://blog.hesey.net/2011/04/introduction-to-java-virtual-machine.html http://coolshell.cn/arti ...

  2. scrapy模拟浏览器爬取验证码页面

    使用selenium模块爬取验证码页面,selenium模块需要另外安装这里不讲环境的配置,我有一篇博客有专门讲ubuntn下安装和配置模拟浏览器的开发 spider的代码 # -*- coding: ...

  3. 数学杂烩总结(多项式/形式幂级数+FWT+特征多项式+生成函数+斯特林数+二次剩余+单位根反演+置换群)

    数学杂烩总结(多项式/形式幂级数+FWT+特征多项式+生成函数+斯特林数+二次剩余+单位根反演+置换群) 因为不会做目录所以请善用ctrl+F 本来想的是笔记之类的,写着写着就变成了资源整理 一些有的 ...

  4. PHP获取客户端的IP、地理信息、浏览器、本地真实IP

    <?php header("Content-type:text/html;charset=utf-8"); // 作用获取客户端的ip.地理信息.浏览器.本地真实IP cla ...

  5. Centos7下安装共存版本Python

    最近遇到个问题, 本机环境已安装了Python2   已安装的应用依赖于Python2,不能替换原系统的Python环境,但新安装的应用需要依赖于Python3 需要安装两个不同版本Python,解决 ...

  6. redis 连接池的一些问题

        问题:  Could not get a resource from the pool 将配置修改为如下: JedisPoolConfig config =newJedisPoolConfig ...

  7. Linux环境下安装Websphere8.5.5

    首先安装包资源: https://pan.baidu.com/s/1Jvkqe3WMgNQ3bn3ggYGhAQ 下面是Installation Manager安装包 agent.installer. ...

  8. hadoop之 hadoop用途方向

    hadoop是什么?Hadoop是一个开源的框架,可编写和运行分不是应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式.Hadoop=HDFS(文 ...

  9. 机器学习(Machine Learning)&深度学习(Deep Learning)资料汇总 (上)

    转载:http://dataunion.org/8463.html?utm_source=tuicool&utm_medium=referral <Brief History of Ma ...

  10. [转]VS2010中使用模块定义文件(.def)

    都知道在写DLL的时候,使用模块定义文件(.def)可以防止DLL里的命名变更. vc6.0中只要在当前目录下添加.def文件,然后编译就Ok了 但在vs2010里这样做是不可以的,必须在项目--属性 ...