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通过面向对象的方法进行异常处理,把各种不 ...
随机推荐
- BZOJ1131 POI2008 Sta 【树形DP】
BZOJ1131 POI2008 Sta Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=10 ...
- (笔记)JQuery扩展方法实现Form表单与Json互相转换
JQuery笔记 记两段代码,使用JQuery实现从表单获取json与后端交互,以及把后端返回的json映射到表单相应的字段上. 把表单转换出json对象 //把表单转换出json对象 $.fn.to ...
- 《DSP using MATLAB》示例 Example 6.14、6.15
- xpath与css_selector定位详解
例题:分别用xPath和css_selector定位下图的img标签 答案: xpath:.//*[@id='fstscr']/div[3]/div[2]/a/img css_selector: . ...
- vb编写串口调试程序
sub是子模块,可以调用但是没有返回值,function是有返回值的. public sub 可以在其它form里调用,而private sub 只能在当前form里调用. vb里的if else , ...
- Android的AsyncQueryHandler详解
摘抄别人的博客,看一下,里面有AsyncQueryHandler的详细介绍.http://blog.csdn.net/yuzhiboyi/article/details/8093408 自从frame ...
- NanoPiM1开箱测试
等了快一周了,终于那M1与那外壳一起给我寄过来了. 上午收到,开箱图就不亮了,来一上好电的图! 一同购买来的MSD卡里什么也没有,上电测试时只看到绿色的灯微微亮(这是一个BUG吗!!!!哈哈). 所以 ...
- SharePoint中使用Visio Service展示业务数据
SharePoint中可以通过Visio Service可以在浏览器中查看Visio图,功能部署到系统中,一切安好. 而现实总是很折磨人,使用该功能后,相关使用者随后提出,Visio图能否与我的业务数 ...
- GNU Radio安装教程: Ubuntu14.04 + uhd3.10.0 + gnuradio3.7.10.1
1. 更新和安装依赖项 在编译安装uhd和gnuradio之前,确保已安装所需依赖项.Ubuntu系统运行: sudo apt-get update 安装UHD和GNURadio所需依赖项: On U ...
- mqtt 异步消息 长连接 解析
mqtt 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放,简单,轻量级,且易于实现,这些优点使得他受用于任何环境 该协议的特点有: 使用发布/订阅消息的模式,提供一对多的消息发布,解除应用 ...