C#基础编程试题 4
一、题目
使用递归算法和二维数组,根据下面条件排序上面的对象。
五个人 张三 李四 王五 猴六 麻七
五间房子 黄房子 蓝房子 红房子 绿房子 橙房子
五只宠物 蜗牛 小狗 小猫 小白兔 小金鱼
五个饮料 水 茶 牛奶 果汁 咖啡
五个食物 圆葱 香蕉 苹果 蘑菇 蛋糕
张三住在红门的房子里
喝牛奶的住在中间房子里
猴六有只小猫,邻居有只小金鱼
麻七住在最左边的房子里
住在绿房子里的喝咖啡
吃圆葱的住在吃苹果的右边
王五喝茶还有只小狗
吃蛋糕的喝果汁
绿房子在最右边,橙色房子在其左边
吃苹果的邻居有只小狗
吃蘑菇的有一只小蜗牛。
猴六吃香蕉
住在黄房子里的吃苹果
麻七的邻居的房子是蓝色的
谁喝水?麻七
谁有只小金鱼?李四
二、解题思路
正确答案如下:

回溯加剪枝。
三、代码
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的更多相关文章
- 经典的Java基础面试题集锦
经典的Java基础面试题集锦,欢迎收藏和分享. 问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”. 问题:Java里的传引用 ...
- Android开发面试经——3.常见Java基础笔试题
Android开发(29) 版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...
- Android开发面试经——2.常见Android基础笔试题
标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报 分类: Android开发(29) 版 ...
- 前端基础面试题(JS部分)
1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String 值类型:数值.布尔值.null.und ...
- 100道Java基础面试题收集整理(附答案)
不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...
- iOS一些基础面试题
Part One 别人问你你都感觉这尼玛说啥的基础面试题 1.UIWindow和UIView和 CALayer 的联系和区别? 答:UIView是视图的基类,UIViewController是视图控制 ...
- 一份最贴近真实面试的Java基础面试题
这是一份Java基础知识的面试题.在网上的关于Java的面试题数不胜数,但认真看过感觉大多数都没有实用性,有很多是面试官根本就不会问到的,那些已经脱离了实际开发的技术问题.而这份资料来源自一份个人觉得 ...
- 最新28道java基础面试题-上
28道java基础面试题 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪 ...
- 28道java基础面试题-下
28道java基础面试题下 15.Java语言如何进行异常处理,关键字:throws.throw.try.catch.finally分别如何使用? 答:Java通过面向对象的方法进行异常处理,把各种不 ...
随机推荐
- C的动态链表建立
运用到的函数为: 动态内存分配函数malloc() 比如:char *name=(char *)malloc(20); 相当与c++的new关键字 动态内存释放函数free ...
- HDU3394Railway Tarjan连通算法
There are some locations in a park, and some of them are connected by roads. The park manger needs t ...
- stm32寄存器版学习笔记07 ADC
STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...
- HTML5的28个常用特性
1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<figure>和<figcapt ...
- 基于模k可逆计数的数字锁相环fpga实现
参考http://wenku.baidu.com/view/59420cb069dc5022aaea00bd.html 实现结构是参考的上边的实例,我用的全同步实现,实现过程中发现一些现象,做下记录. ...
- timequest 中set input delay set output delay 的使用
set_input_delay/ set_output_delay TimeQuest出现以后,随之 set input delay 与 set output delay 也跟着出现,该约束命令用“外 ...
- qqbot 配置
qqbot 配置 用起来还是挺方便的,使用 pip install qqbot 就可以. 不过找配置文件没注意,以为是在程序目前,原来是在 C:\Users\xxx.qqbot-tmp 目录. 插件可 ...
- Spark Streaming性能调优
数据接收并行度调优(一) 通过网络接收数据时(比如Kafka.Flume),会将数据反序列化,并存储在Spark的内存中.如果数据接收称为系统的瓶颈,那么可以考虑并行化数据接收.每一个输入DStrea ...
- 面试常考知识点——Java(JVM,JDK,JRE)
1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:(1)Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. ...
- https 请求的端口是443 注意
注意: 这里录制https的请求 端口号一定是443 才可以抓取到!!!!!! (进坑多次)