吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3247|回复: 5
收起左侧

[其他转载] 一道及其复杂的逻辑题,用C#程序解决平均用时不到1毫秒!来学习一下吧。

  [复制链接]
大白痴先生 发表于 2017-11-16 02:00
原题来源于这个帖子:
https://www.52pojie.cn/thread-590525-1-1.html

因为原贴时间已经比较久了,另外我提供了新方法,在原帖的回复已经被淹没,大家起不到学习的作用,故而新开一贴。原题目如下:

085131tczixa38feazi9xi.jpg

此题确实算比较复杂了,我用C#最朴素的思路来解决,在8G内存的虚拟机上执行平均用时不到一毫秒,大家可以试试。

vmware_2017-11-16_01-58-00.png

程序如下:

[C#] 纯文本查看 复制代码
void Main()
{
	for (int q1 = 1; q1 <= 4; q1++)
	{
		for (int q2 = 1; q2 <= 4; q2++)
		{
			for (int q3 = 1; q3 <= 4; q3++)
			{
				for (int q4 = 1; q4 <= 4; q4++)
				{
					for (int q5 = 1; q5 <= 4; q5++)
					{
						if ((q2 == 1 && q5 != 3) || 
						    (q2 == 2 && q5 != 4) || 
							(q2 == 3 && q5 != 1) || 
							(q2 == 4 && q5 != 2))
						{
							continue;
						}
						if (q4 == 1 && q1 != q5)
						{
							continue;
						}
						if (q5 == 2 && q5 != q4)
						{
							continue;
						}
						for (int q6 = 1; q6 <= 4; q6++)
						{
							if ((q3 == 1) && (q3 == q6 || q3 == q2 || q3 == q4))
							{
								continue;
							}
							if ((q3 == 2) && (q6 == q3 || q6 == q2 || q6 == q4))
							{
								continue;
							}
							if ((q3 == 3) && (q2 == q3 || q2 == q6 || q2 == q4))
							{
								continue;
							}
							if ((q3 == 4) && (q4 == q3 || q4 == q6 || q4 == q2))
							{
								continue;
							}

							for (int q7 = 1; q7 <= 4; q7++)
							{
								if (q4 == 2 && q2 != q7)
								{
									continue;
								}
								if (q5 == 4 && q5 != q7)
								{
									continue;
								}
								for (int q8 = 1; q8 <= 4; q8++)
								{
									if (q5 == 1 && q5 != q8)
									{
										continue;
									}
									if (q6 == 1 && ((q2 != q4 || q4 != q8 || q2 != q8)))
									{
										continue;
									}
									if (q6 == 2 && ((q1 != q6 || q1 != q8 || q6 != q8)))
									{
										continue;
									}
									if ((q8 == 1 && (Math.Abs(q7 - q1) == 1)) || 
									    (q8 == 2 && (Math.Abs(q5 - q1) == 1)) ||
										(q8 == 3 && (Math.Abs(q2 - q1) == 1)))  
									{
										continue;
									}
									for (int q9 = 1; q9 <= 4; q9++)
									{
										if (q4 == 3 && q1 != q9)
										{
											continue;
										}
										if (q5 == 3 && q5 != q9)
										{
											continue;
										}
										if (q6 == 4 && ((q5 != q9 || q5 != q8 || q9 != q8)))
										{
											continue;
										}
										if (q9 == 1 && ((q1 == q6) == (q6 == q5)))
										{
											continue;
										}
										if (q9 == 3 && ((q1 == q6) == (q2 == q5)))
										{
											continue;
										}
										if (q9 == 4 && ((q1 == q6) == (q9 == q5)))
										{
											continue;
										}
										for (int q10 = 1; q10 <= 4; q10++)
										{
											if (q4 == 4 && q6 != q10)
											{
												continue;
											}
											if (q6 == 3 && ((q3 != q10 || q3 != q8 || q10 != q8)))
											{
												continue;
											}
											if (q8 == 4 && (Math.Abs(q10 - q1) == 1))
											{
												continue;
											}
											if (q9 == 2 && ((q1 == q6) == (q10 == q5)))
											{
												continue;
											}
											int[] a = { q1, q2, q3, q4, q5, q6, q7, q8, q9, q10 };
											int repeat_max = a.GroupBy(s => s).OrderByDescending(s => s.Count()).Select(s => s.Count()).First();
											int repeat_min = a.GroupBy(s => s).OrderByDescending(s => s.Count()).Select(s => s.Count()).Last();
											int repeat_min_item = a.GroupBy(s => s).OrderByDescending(s => s.Count()).Last().Key;
											
											if ((q10 == 1 && (repeat_max - repeat_min) != 3) ||
											    (q10 == 2 && (repeat_max - repeat_min) != 2) ||
											    (q10 == 3 && (repeat_max - repeat_min) != 4) ||
											    (q10 == 4 && (repeat_max - repeat_min) != 1))
											{
												continue;
											}

											if ((q7 == 1 && repeat_min_item != 3) ||
											    (q7 == 2 && repeat_min_item != 2) ||
											    (q7 == 3 && repeat_min_item != 1) ||
											    (q7 == 4 && repeat_min_item != 4))
											{
												continue;
											}

											Console.WriteLine($"{q1}, {q2}, {q3}, {q4}, {q5}, {q6}, {q7}, {q8}, {q9}, {q10}");
											Console.WriteLine("=====================================");
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}


}


免费评分

参与人数 3吾爱币 +3 热心值 +4 收起 理由
I胡闹I + 2 + 2 我很赞同!
废宅小五 + 1 谢谢@Thanks!
ubuntu + 1 + 1 简单粗暴我喜欢

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

WCM3550220 发表于 2017-11-16 03:18
三长一短选最短
三短一长选最长
长短不一要选B
参差不齐就选D

4c9584b6c6e52d0d4058140101a0aa9d.gif
wang65424773 发表于 2017-11-16 06:39 来自手机
这题推理真有些复杂,1ms挺快的,毕竟循环套循环
那个是哪个丶 发表于 2017-11-16 08:56
焚心的小丑 发表于 2017-11-16 11:29
这1ms绝对把楼主写代码时间也算进去了
lzv17030209 发表于 2018-8-18 13:05
焚心的小丑 发表于 2017-11-16 11:29
这1ms绝对把楼主写代码时间也算进去了

那楼主真乃神人也
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 20:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表