using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace ConsoleAppFish
{
//求解:"谁养鱼"(爱因斯坦所出的一道推理题)
//1、在一条街上,有5座房子,喷了5种颜色。
//2、每个房里住着不同国籍的人
//3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物
//问题是:谁养鱼?
//提示:
//1、英国人住红色房子
//2、瑞典人养狗
//3、丹麦人喝茶
//4、绿色房子在白色房子左面
//5、绿色房子主人喝咖啡
//6、抽Pall Mall 香烟的人养鸟
//7、黄色房子主人抽Dunhill 香烟
//8、住在中间房子的人喝牛奶
//9、 挪威人住第一间房
//10、抽Blends香烟的人住在养猫的人隔壁
//11、养马的人住抽Dunhill 香烟的人隔壁
//12、抽Blue Master的人喝啤酒
//13、德国人抽Prince香烟
//14、挪威人住蓝色房子隔壁
//15、抽Blends香烟的人有一个喝水的邻居
//爱因斯坦在20世纪初出的这个谜语。他说世界上有98%的人答不出
class Program
{
static Queue<Scene> myScene = new Queue<Scene>();
static int Counter = 0;
static void Main(string[] args)
{
setRule1();
while (myScene.Count > 0)
{
continueGo();
}
}
static private void GetFish(Scene SceneNow)
{
Console.WriteLine(SceneNow.ToString());
Debug.Write(SceneNow.ToString());
//Debug.Write(Counter);
}
static private void continueGo()
{
Scene SceneNow = myScene.Dequeue();
//Debug.Write(SceneNow.Step);
Counter++;
switch (SceneNow.Step)
{
case 2:
{
setRule2(SceneNow);
break;
}
case 3:
{
setRule3(SceneNow);
break;
}
case 4:
{
setRule4(SceneNow);
break;
}
case 5:
{
setRule5(SceneNow);
break;
}
case 6:
{
setRule6(SceneNow);
break;
}
case 7:
{
setRule7(SceneNow);
break;
}
case 8:
{
setRule8(SceneNow);
break;
}
case 9:
{
setRule9(SceneNow);
break;
}
case 10:
{
setRule10(SceneNow);
break;
}
case 11:
{
setRule11(SceneNow);
break;
}
case 12:
{
setRule12(SceneNow);
break;
}
case 13:
{
setRule13(SceneNow);
break;
}
case 14:
{
setRule14(SceneNow);
break;
}
case 15:
{
setRule15(SceneNow);
break;
}
default:
{
GetFish(SceneNow);
break;
}
}
}
static private bool setRule1()
{//1、英国人住红色房子
House[] MyHouse = { new House(1), new House(2), new House(3), new House(4), new House(5) };
Scene s1 = new Scene(2, MyHouse);
s1.MyHouse[0].nationalities = nationalities.英国;
s1.MyHouse[0].HouseColor = HouseColor.红色;
myScene.Enqueue(s1);
s1 = new Scene(2, MyHouse);
s1.MyHouse[1].nationalities = nationalities.英国;
s1.MyHouse[1].HouseColor = HouseColor.红色;
myScene.Enqueue(s1);
s1 = new Scene(2, MyHouse);
s1.MyHouse[2].nationalities = nationalities.英国;
s1.MyHouse[2].HouseColor = HouseColor.红色;
myScene.Enqueue(s1);
s1 = new Scene(2, MyHouse);
s1.MyHouse[3].nationalities = nationalities.英国;
s1.MyHouse[3].HouseColor = HouseColor.红色;
myScene.Enqueue(s1);
s1 = new Scene(2, MyHouse);
s1.MyHouse[4].nationalities = nationalities.英国;
s1.MyHouse[4].HouseColor = HouseColor.红色;
myScene.Enqueue (s1);
return true;
}
static private bool setRule2(Scene SceneNow)
{//2、瑞典人养狗
if (SceneNow.MyHouse.Where(h => h.nationalities == nationalities.瑞典).Count() == 0)
{
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].nationalities == nationalities.Null)
{
Scene s1 = new Scene(2, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].nationalities = nationalities.瑞典;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了 ,
int number = SceneNow.MyHouse.Single(h => h.nationalities == nationalities.瑞典).Number;
if (SceneNow.MyHouse[number - 1].pet == pet.Null ||
SceneNow.MyHouse[number - 1].pet == pet.狗)
{
Scene s1 = new Scene(3, SceneNow.MyHouse);
s1.MyHouse[number - 1].pet = pet.狗;
myScene.Enqueue(s1);
}
}
return true;
}
static private bool setRule3(Scene SceneNow)
{//3、丹麦人喝茶
if (SceneNow.MyHouse.Where(h => h.nationalities == nationalities.丹麦).Count() == 0)
{
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].nationalities == nationalities.Null)
{
Scene s1 = new Scene(3, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].nationalities = nationalities.丹麦;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了 ,
int number = SceneNow.MyHouse.Single(h => h.nationalities == nationalities.丹麦).Number;
if (SceneNow.MyHouse[number - 1].brink == brink.Null ||
SceneNow.MyHouse[number - 1].brink == brink.茶)
{
Scene s1 = new Scene(4, SceneNow.MyHouse);
s1.MyHouse[number - 1].brink = brink.茶;
myScene.Enqueue(s1);
}
}
return true;
}
static private bool setRule4(Scene SceneNow)
{//4.绿色房子在白色房子左面
//先判断有无 白色,如果没有假设一个,在设为 隔壁旁边 为 绿色(因为左右其实是不能区分的其实和隔壁是同义词)
if (SceneNow.MyHouse.Where(h => h.HouseColor == HouseColor.白色).Count() == 0)
{//还没有人抽Blends
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].HouseColor == HouseColor.Null)
{
Scene s1 = new Scene(4, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].HouseColor = HouseColor.白色;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了 ,设置为 绿色
int number = SceneNow.MyHouse.Single(h => h.HouseColor == HouseColor.白色).Number;
if (number > 1)
{//左边
if (SceneNow.MyHouse[number - 1 - 1].HouseColor == HouseColor.Null || SceneNow.MyHouse[number - 1 - 1].HouseColor == HouseColor.绿色)
{
Scene s1 = new Scene(5, SceneNow.MyHouse);
s1.MyHouse[number - 1 - 1].HouseColor = HouseColor.绿色;
myScene.Enqueue(s1);
}
}
if (number < 5)
{//右边
if (SceneNow.MyHouse[number + 1 - 1].HouseColor == HouseColor.Null || SceneNow.MyHouse[number + 1 - 1].HouseColor == HouseColor.绿色)
{
Scene s1 = new Scene(5, SceneNow.MyHouse);
s1.MyHouse[number + 1 - 1].HouseColor = HouseColor.绿色;
myScene.Enqueue(s1);
}
}
}
return true;
}
static private bool setRule5(Scene SceneNow)
{//5、绿色房子主人喝咖啡
//bool ret = false;
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].HouseColor == HouseColor.绿色 && SceneNow.MyHouse[i].brink == brink.Null)
{
Scene s1 = new Scene(6, SceneNow.MyHouse);
s1.MyHouse[i].brink = brink.咖啡;
myScene.Enqueue(s1);
}
}
return true;
}
static private bool setRule6(Scene SceneNow)
{//6.抽Pall Mall 香烟的人养鸟
//先判断有无 Pall Mall,如果没有假设一个,在设为 鸟
if (SceneNow.MyHouse.Where(h => h.cigarettes == cigarettes.PallMall ).Count() == 0)
{//还没有人抽cigarettes
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].cigarettes == cigarettes.Null)
{
Scene s1 = new Scene(6, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].cigarettes = cigarettes.PallMall;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了 ,设置为喝啤酒
int number = SceneNow.MyHouse.Single(h => h.cigarettes == cigarettes.PallMall).Number;
if (SceneNow.MyHouse[number - 1].pet == pet.Null ||
SceneNow.MyHouse[number - 1].pet == pet.鸟)
{
Scene s1 = new Scene(7, SceneNow.MyHouse);
s1.MyHouse[number - 1].pet = pet.鸟;
myScene.Enqueue(s1);
}
}
return true;
}
static private bool setRule7(Scene SceneNow)
{//7、黄色房子主人抽Dunhill 香烟
//先判断有无黄色,如果没有假设一个,在设为Dunhill
if (SceneNow.MyHouse.Where(h => h.HouseColor == HouseColor.黄色).Count() == 0)
{//还没有人抽Blends
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].HouseColor == HouseColor.Null)
{
Scene s1 = new Scene(7, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].HouseColor = HouseColor.黄色 ;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了 ,设置为喝啤酒
int number = SceneNow.MyHouse.Single(h => h.HouseColor == HouseColor.黄色).Number;
if (SceneNow.MyHouse[number - 1].cigarettes == cigarettes.Null ||
SceneNow.MyHouse[number - 1].cigarettes == cigarettes.Dunhill )
{
Scene s1 = new Scene(8, SceneNow.MyHouse);
s1.MyHouse[number - 1].cigarettes = cigarettes.Dunhill;
myScene.Enqueue(s1);
}
}
return true;
}
static private bool setRule8(Scene SceneNow)
{//8、住在中间房子的人喝牛奶
//判断中间的房子还没有设置饮料或者设置的是牛奶
int middle = 2;
if (SceneNow.MyHouse[middle].brink == brink.Null || SceneNow.MyHouse[middle].brink == brink.牛奶)
{
Scene s1 = new Scene(9, SceneNow.MyHouse);
s1.MyHouse[middle].brink = brink.牛奶;
myScene.Enqueue(s1);
}
return true;
}
static private bool setRule9(Scene SceneNow)
{//9、 挪威人住第一间房
//判断第一件的房子还没有设置国籍或者设置的是挪威
int first = 0;
if (SceneNow.MyHouse[first].nationalities == nationalities.Null || SceneNow.MyHouse[first].nationalities == nationalities.挪威)
{
Scene s1 = new Scene(10, SceneNow.MyHouse);
s1.MyHouse[first].nationalities = nationalities.挪威;
myScene.Enqueue(s1);
}
return true;
}
static private bool setRule10(Scene SceneNow)
{//10、抽Blends香烟的人住在养猫的人隔壁
//先判断有没有抽Blends的人,如果有在旁边设置养猫的人,如果没有,先假设几种抽Blends香烟的人
if (SceneNow.MyHouse.Where(h => h.cigarettes == cigarettes.Blends).Count() == 0)
{//还没有人抽Blends
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].cigarettes == cigarettes.Null )
{
Scene s1 = new Scene(10, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].cigarettes = cigarettes.Blends ;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了
int number = SceneNow.MyHouse.Single(h => h.cigarettes == cigarettes.Blends).Number;
if (number >1)
{//左边
if (SceneNow.MyHouse[number - 1 - 1].pet == pet.Null ||
SceneNow.MyHouse[number - 1 - 1].pet == pet.猫)
{
Scene s1 = new Scene(11, SceneNow.MyHouse);
s1.MyHouse[number - 1 - 1].pet = pet.猫;
myScene.Enqueue(s1);
}
}
if (number <5)
{//右边
if (SceneNow.MyHouse[number + 1 - 1].pet == pet.Null ||
SceneNow.MyHouse[number + 1 - 1].pet == pet.猫)
{
Scene s1 = new Scene(11, SceneNow.MyHouse);
s1.MyHouse[number + 1 - 1].pet = pet.猫;
myScene.Enqueue(s1);
}
}
}
return true;
}
static private bool setRule11(Scene SceneNow)
{//11、养马的人住抽Dunhill 香烟的人隔壁
//先判断有没有抽Dunhill的人,如果有在旁边设置养马的人,如果没有,先假设几种抽Dunhill香烟的人
if (SceneNow.MyHouse.Where(h => h.cigarettes == cigarettes.Dunhill ).Count() == 0)
{
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].cigarettes == cigarettes.Null )
{
Scene s1 = new Scene(11, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].cigarettes = cigarettes.Dunhill;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了
int number = SceneNow.MyHouse.Single(h => h.cigarettes == cigarettes.Dunhill).Number;
if (number >1)
{//左边
if (SceneNow.MyHouse[number - 1-1].pet == pet.Null ||
SceneNow.MyHouse[number - 1-1].pet == pet.马)
{
Scene s1 = new Scene(12, SceneNow.MyHouse);
s1.MyHouse[number - 1 - 1].pet = pet.马;
myScene.Enqueue(s1);
}
}
if (number <5)
{//右边
if (SceneNow.MyHouse[number + 1 - 1].pet == pet.Null ||
SceneNow.MyHouse[number + 1 - 1].pet == pet.马)
{
Scene s1 = new Scene(12, SceneNow.MyHouse);
s1.MyHouse[number + 1 - 1].pet = pet.马;
myScene.Enqueue(s1);
}
}
}
return true;
}
static private bool setRule12(Scene SceneNow)
{//12、抽Blue Master的人喝啤酒
//先判断有没有,如果没有假设几种 抽Blue Master的人,在回到本步骤,设置为喝啤酒
if (SceneNow.MyHouse.Where(h => h.cigarettes == cigarettes.BlueMaster ).Count() == 0)
{//还没有人抽Blends
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].cigarettes == cigarettes.Null)
{
Scene s1 = new Scene(12, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].cigarettes = cigarettes.BlueMaster;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了 ,设置为喝啤酒
int number = SceneNow.MyHouse.Single(h => h.cigarettes == cigarettes.BlueMaster).Number;
if (SceneNow.MyHouse[number - 1].brink == brink.Null ||
SceneNow.MyHouse[number - 1].brink == brink.啤酒)
{
Scene s1 = new Scene(13, SceneNow.MyHouse);
s1.MyHouse[number - 1].brink = brink.啤酒;
myScene.Enqueue(s1);
}
}
return true;
}
static private bool setRule13(Scene SceneNow)
{//13、德国人抽Prince香烟
//先判断有没有,如果没有假设几种 德国人,在回到本步骤,设置为抽Prince香烟
if (SceneNow.MyHouse.Where(h => h.nationalities == nationalities.德国).Count() == 0)
{//还没有人抽Blends
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].nationalities == nationalities.Null)
{
Scene s1 = new Scene(13, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].nationalities = nationalities.德国;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了 ,设置为喝啤酒
int number = SceneNow.MyHouse.Single(h => h.nationalities == nationalities.德国).Number;
if (SceneNow.MyHouse[number - 1].cigarettes == cigarettes.Null ||
SceneNow.MyHouse[number - 1].cigarettes == cigarettes.Prince)
{
Scene s1 = new Scene(14, SceneNow.MyHouse);
s1.MyHouse[number - 1].cigarettes = cigarettes.Prince;
myScene.Enqueue(s1);
}
}
return true;
}
static private bool setRule14(Scene SceneNow)
{//14、挪威人住蓝色房子隔壁
int n = myScene.Where(s => s.MyHouse[1].HouseColor == HouseColor.蓝色).Count();
//先判断有没有 蓝色房子,如果有在旁边 设为 挪威 ,如果没有,先假设几种 蓝色
if (SceneNow.MyHouse.Where(h => h.HouseColor == HouseColor.蓝色).Count() == 0)
{//还没有 蓝色
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].HouseColor == HouseColor.Null || SceneNow.MyHouse[i].HouseColor == HouseColor.蓝色 )
{
Scene s1 = new Scene(14, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].HouseColor = HouseColor.蓝色 ;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了
int number = SceneNow.MyHouse.Single(h => h.HouseColor == HouseColor.蓝色).Number;
if (number >1)
{//左边
if (SceneNow.MyHouse[number - 1 - 1].nationalities == nationalities.Null ||
SceneNow.MyHouse[number - 1 - 1].nationalities == nationalities.挪威)
{
Scene s1 = new Scene(15, SceneNow.MyHouse);
s1.MyHouse[number - 1 - 1].nationalities = nationalities.挪威;
myScene.Enqueue(s1);
}
}
if (number <5)
{//右边
if (SceneNow.MyHouse[number + 1 - 1].nationalities == nationalities.Null ||
SceneNow.MyHouse[number + 1 - 1].nationalities == nationalities.挪威)
{
Scene s1 = new Scene(15, SceneNow.MyHouse);
s1.MyHouse[number + 1 - 1].nationalities = nationalities.挪威;
myScene.Enqueue(s1);
}
}
}
return true;
}
static private bool setRule15(Scene SceneNow)
{//15、抽Blends香烟的人有一个喝水的邻居
//先判断有没有 Blends,如果有在旁边 设为 喝水 ,如果没有,先假设几种 Blends
if (SceneNow.MyHouse.Where(h => h.cigarettes == cigarettes.Blends ).Count() == 0)
{//还没有 Blends
for (int i = 0; i <= 4; i++)
{
if (SceneNow.MyHouse[i].cigarettes == cigarettes.Null)
{
Scene s1 = new Scene(15, SceneNow.MyHouse); //还是回到这一步
s1.MyHouse[i].cigarettes = cigarettes.Blends;
myScene.Enqueue(s1);
}
}
}
else
{//已经有了
int number = SceneNow.MyHouse.Single(h => h.cigarettes == cigarettes.Blends).Number;
if (number >1)
{//左边
if (SceneNow.MyHouse[number - 1 - 1].brink == brink.Null || SceneNow.MyHouse[number - 1 - 1].brink == brink.水 )
{
Scene s1 = new Scene(16, SceneNow.MyHouse);
s1.MyHouse[number - 1 - 1].brink = brink.水;
myScene.Enqueue(s1);
}
}
if (number <5)
{//右边
if (SceneNow.MyHouse[number + 1 - 1].brink == brink.Null || SceneNow.MyHouse[number + 1 - 1].brink == brink.水)
{
Scene s1 = new Scene(16, SceneNow.MyHouse);
s1.MyHouse[number + 1 - 1].brink = brink.水;
myScene.Enqueue(s1);
}
}
}
return true;
}
}
class Scene
{
public int Step = 0;
public House[] MyHouse;
public Scene(int step,House[] MyHouse)
{
Step = step;
this.MyHouse = (House[])MyHouse.Clone();
this.MyHouse[0] = this.MyHouse[0].clone();
this.MyHouse[1] = this.MyHouse[1].clone();
this.MyHouse[2] = this.MyHouse[2].clone();
this.MyHouse[3] = this.MyHouse[3].clone();
this.MyHouse[4] = this.MyHouse[4].clone();
}
public override string ToString()
{
string output = "\nScene:(step" + Step.ToString() + ")\n";
foreach (House h in MyHouse)
{
output += h.ToString() + "\n";
}
return output;
}
}
class House
{
public int Number;
public HouseColor HouseColor = HouseColor.Null ;
public nationalities nationalities = nationalities.Null ;
public pet pet = pet.Null ;
public cigarettes cigarettes= cigarettes.Null ;
public brink brink = brink.Null ;
public House(int number)
{
Number = number;
}
public House clone()
{
House newHouse = new House(this.Number);
newHouse.HouseColor = this.HouseColor;
newHouse.nationalities = this.nationalities;
newHouse.pet = this.pet;
newHouse.cigarettes = this.cigarettes;
newHouse.brink = this.brink;
return newHouse;
}
public override string ToString()
{
return string.Format("No:{0},颜色:{1},国籍:{2},宠物:{3},香烟:{4},饮料:{5}",
Number, HouseColor, nationalities, pet, cigarettes, brink);
}
}
enum HouseColor
{
Null,红色, 白色,绿色, 黄色, 蓝色
}
enum nationalities
{
Null, 英国, 瑞典, 丹麦, 挪威, 德国
}
enum pet
{
Null, 狗, 鸟, 猫, 马, 鱼
}
enum cigarettes
{
Null, PallMall, Dunhill, Blends, BlueMaster, Prince
}
enum brink
{
Null, 茶, 咖啡, 牛奶, 啤酒, 水
}
}