一、题目

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

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

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

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

二、解题思路

  正确答案如下:

    

  回溯加剪枝。

三、代码

 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. SQL之 UNION ALL 和UNION

    有时候复杂的逻辑处理可以交给SQL来处理,自认为是比java处理要快点. 举个例子:如何统计每个品牌的的偏好用户数? 当时我做的处理是在java中处理这些品牌,若是品牌相同,就加一,但是这种方法很慢, ...

  2. RNG—随机数产生器

    RNG 随机数产生器 RNG g_rng(12345); /********************************************************************** ...

  3. PHP 读取和导出 CSV文件

    PHP 读取和导出 CSV文件,速度比phpexcel快80%,而phpexcel 占内存,在数据大的情况下,5万条只需几秒不到,几乎感觉不出来 如果遇到数字是科学计算法,可以在前面加一个 ' 单引号 ...

  4. js中confirm揭示三个按钮“是”“否”“取消”

    js中confirm提示三个按钮“是”“否”“取消” 重载DOM中confirm window.confirm = function(str) {   str=str.replace(/\'/g, & ...

  5. {Emgu}{C#}保存图片、视频等

    一.簡介 以前研究所的時候,有使用VC.NET 配合 OpenCV 做影像處理,這東西相當讚,可以省去不少開發時間,今天嘗試看看如何在Visual C# 2008 上使用 OpenCV. 以下引用 O ...

  6. sentry docker-compsoe 安装以及简单使用

    1. 准备环境 docker docker-compose     2. 安装 a. docker-compose git clone git clone https://github.com/get ...

  7. 基于C#的UDP协议的同步实现

    一.摘要 总结基于C#的UDP协议的同步通信. 二.实验平台 Visual Studio 2010 三.实验原理 UDP传输协议同TCP传输协议的区别可查阅相关文档,此处不再赘述. 四.实例  4.1 ...

  8. Linux VPS禁止某个IP访问

    http://www.vpser.net/security/linux-vps-deny-ip.html

  9. 坑爹的AMH

    坑爹的 AMH的配置文件在这里: nginx 配置文件1:/usr/local/nginx-generic-1.6/conf/nginx.conf nginx 配置文件2:/home/wwwroot/ ...

  10. [转]nginx虚拟目录(alias与root的区别)

    今天配置awstats,awstats创建出的文件目录在/home/awstats下,在nginx中加入配置后狂报404,发现还是忽略了root和alias的区别,特将修改配置记录如下: 1.失败:s ...