一、题目

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

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

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

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

二、解题思路

  正确答案如下:

    

  回溯加剪枝。

三、代码

 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. C的动态链表建立

    运用到的函数为: 动态内存分配函数malloc()              比如:char *name=(char *)malloc(20);  相当与c++的new关键字 动态内存释放函数free ...

  2. HDU3394Railway Tarjan连通算法

    There are some locations in a park, and some of them are connected by roads. The park manger needs t ...

  3. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

  4. HTML5的28个常用特性

    1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<figure>和<figcapt ...

  5. 基于模k可逆计数的数字锁相环fpga实现

    参考http://wenku.baidu.com/view/59420cb069dc5022aaea00bd.html 实现结构是参考的上边的实例,我用的全同步实现,实现过程中发现一些现象,做下记录. ...

  6. timequest 中set input delay set output delay 的使用

    set_input_delay/ set_output_delay TimeQuest出现以后,随之 set input delay 与 set output delay 也跟着出现,该约束命令用“外 ...

  7. qqbot 配置

    qqbot 配置 用起来还是挺方便的,使用 pip install qqbot 就可以. 不过找配置文件没注意,以为是在程序目前,原来是在 C:\Users\xxx.qqbot-tmp 目录. 插件可 ...

  8. Spark Streaming性能调优

    数据接收并行度调优(一) 通过网络接收数据时(比如Kafka.Flume),会将数据反序列化,并存储在Spark的内存中.如果数据接收称为系统的瓶颈,那么可以考虑并行化数据接收.每一个输入DStrea ...

  9. 面试常考知识点——Java(JVM,JDK,JRE)

    1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:(1)Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. ...

  10. https 请求的端口是443 注意

    注意: 这里录制https的请求 端口号一定是443 才可以抓取到!!!!!! (进坑多次)