目录

1. 问题描述

2. 解题分析

3. 代码及测试

4. 后记


1. 问题描述

这道题的描述应该是有问题的(不知道是原文的问题还是翻译的问题)。

前面的描述中提到“前后左右的座位全是异性”和NG示例中的“前后左右全是同性”两种情况。问题中所要求满足的“上述条件”是什么呢?仅从上下文来看第一感当然是说“前后左右的座位全是异性”。但是仔细一想就知道这个不对,每个座位的“前后左右的座位都是异性”的安排情况只有两种。

“前后左右的座位全是异性”和“前后左右全是同性”的两种极端情况之间还有巨大的灰色空间。问题的原意应该是指满足“任何一个座位的前后左右不全是同性(或至少有一个异性)”的情况吧?

2. 解题分析

先考虑一个基本方案。

从搜索方式来说,这个问题与前面的Q32和Q59等题有类似之处。只需要基于Q32或Q59的基本框架略作修改即可。

要点说明:

  1. 与Q32, Q59一样,逐行扫描,每次向右移一格。右边到头即移到下一格。到达最下边的围栏行则表明已经完成一次搜索,找到一个合规的安排方案
  2. “违规检查”只需要针对当前座位的左边座位和上边座位,这是因为扫描是向右、下方向进行的,当前座位的右边和下边还没有安排人,所以右边座位和下边座位肯定还没有违规
  3. 最后还必须满足男生和女生人数都必须相等

3. 代码及测试

# -*- coding: utf-8 -*-
"""
Created on Tue Oct 19 07:39:48 2021@author: chenxy
"""import sys
import time
import datetime
import math
# import random
from   typing import List
from   collections import deque
import itertools as it
import numpy as npH = 5 # Height, vertical
W = 6 # Width,  horizontal# seats initialization, with a guard band surrounding the original seats
# The guard band is initialized to '-1' to simplify the judgement processing.
seats = np.zeros((H+2, W+2))
seats[0,:] = -1
seats[H+1,:] = -1
seats[:,0] = -1
seats[:,W+1] = -1count = 0def isNG(h,w):if seats[h,w] == -1:return Falsereturn (seats[h+1,w]==seats[h,w] or seats[h+1,w]==-1) and \(seats[h-1,w]==seats[h,w] or seats[h-1,w]==-1) and \(seats[h,w+1]==seats[h,w] or seats[h,w+1]==-1) and \(seats[h,w-1]==seats[h,w] or seats[h,w-1]==-1) def arrange_seat(h,w, boy, girl)->int:'''Parameters----------(h,w) : The current exploration point. h represents row index, w represents col index.Returns: intThe number of total arrangement starting from the point (h,w), together with the current seats status, which is a global variable'''        global count# print('h = {0}, w = {1}'.format(h,w))if   h == H + 1:if boy == girl:count = count + 1# print(seats)    elif w == W + 1: # Go to the next row.# Reach the right boundary, go to explore the next row from the left arrange_seat(h+1, 1, boy, girl)# elif seats[h,w] > 0: #     # This grid has been occupied, move to the right one#     arrange_seat(h, w+1)else:# Try to arrange boy to the current seat(h,w)seats[h,w] = 1if not (isNG(h-1,w) or isNG(h,w-1) or isNG(h,w)):arrange_seat(h,w+1, boy+1, girl)            seats[h,w] = 0# Try to arrange girl to the current seat(h,w)seats[h,w] = 2if not (isNG(h-1,w) or isNG(h,w-1) or isNG(h,w)):arrange_seat(h,w+1, boy, girl+1)            seats[h,w] = 0tStart = time.perf_counter()
arrange_seat(1, 1, 0, 0)
tCost  = time.perf_counter() - tStart
print('count = {0}, tCost = {1:6.3f}(sec)'.format(count,tCost))  

运行结果:

[3,4]: count = 354, tCost =  0.014(sec)

[4,5]: count = 34874, tCost =  1.649(sec)

[5,6]: count = 13374192, tCost = 803.130(sec)

4. 后记

跟昨天的Q69一样,给出一个功能正确的方案并不难,但是运行太慢了!所以这些问题的难点在于如何提高运行效率,比如说书中所提示的剪枝,还有memoization等啊?容我再想一想。。。

上一篇:Q67: 不挨着坐是一种礼节吗?

下一篇:Q69: 蓝白歌会(1)

本系列总目录参见:程序员的算法趣题:详细分析和Python全解

程序员的算法趣题Q68: 异性相邻的座位安排(1)相关推荐

  1. php算法求出一个数可以被分解成多少个_程序员的算法趣题

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  2. 程序员的算法趣题Q67: 不挨着坐是一种礼节吗?

    目录 1. 问题描述 2. 解题分析 2.1 基本思路 2.2 动态规划 2.3 算法流程 3. 代码及测试 4. 后记 1. 问题描述 注意,本问题不区分人,只考虑各个座位被占用的不同顺序的个数. ...

  3. 程序员的算法趣题Q66: 设计填字游戏

    目录 1. 问题描述 2. 解题分析 2.1 基本算法流程 2.2 连通性检查 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 与前面的Q32.Q59以及后面的Q68(碰巧先做了Q68) ...

  4. LeetBook《程序员的算法趣题》Q18---水果酥饼日

    <程序员的算法趣题>-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言. Q18 水果酥饼日   日本每月的 22 日是水果酥 ...

  5. 程序员的算法趣题Q50: 完美洗牌

    目录 1. 问题描述 2. 解题分析 2.1 思路1 2.2 思路2 3. 代码及测试 4. 后记 1. 问题描述 问题:对2n张牌洗牌,并求当1<=n<=100时,一共有多少个n可以使得 ...

  6. 程序员的算法趣题Q09: 落单的男女

    目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 思考 1. 问题描述 人们聚集在某个活动会场上,根据到场顺序排成一排等待入场,活动的主办人员,想把人们从队列的某个位置分成两组,想要让分开 ...

  7. 程序员的算法趣题Q55: 平分蛋糕

    目录 1. 问题描述 2. 解题分析 2.1 初始算法流程 2.2 优化 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 这个题目第一感就是动态规划. 对于(m, n)形状(如下图所示, ...

  8. 程序员的算法趣题Q57: 最快的联络网

    目录 1. 问题描述 2. 解题分析 2.1 学生的状态 2.2 学生状态转移 Case-T1:Do nothing, just wait Case-T2:给处于S0状态的学生打电话 Case-T3: ...

  9. 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)

    题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...

最新文章

  1. 使用SVG中的Symbol元素制作Icon
  2. 给web请求加遮罩动画
  3. 算法:串联所有单词的子串
  4. Mysql读写分离php脚本
  5. php cookie 二级域名,php如何设置cookie对整个域名有效及二级域名
  6. 字节跳动和腾讯不正当竞争案将于深圳开庭 抖音:我们也是看新闻才知道本月24日要开庭...
  7. maven使用mvn命令创建项目异常java.lang.NoClassDefFoundError: org/apache/commons/collections/ExtendedProperties
  8. Login as Root in Ubuntu 12.10
  9. 武汉理工大学-数值分析-2019年期末复习提纲
  10. 旋转矩阵与四元数的理解
  11. 2022-4-16 c++ 杂记 mutex GUARDED_BY std::unique_ptr unordered_map ::开头
  12. PHP的implode函数运用,什么是PHP中的implode()函数?
  13. 南开大学张昊计算机,纽约南开校友会隆重举办纪念南开大学建校100周年庆典
  14. 如何查看docker的版本号是多少
  15. 计算机求职简历考试题题大学,大学计算机基础上机实验指导与习题,word的设计性实-个人简历.docx...
  16. Java基础50题(3) 21~30题
  17. arcgis终结时间表
  18. 报告上集 | 《认文识字·中文字信息精准化》报告
  19. Openwrt动态域名解析
  20. python如何爬虫eps数据_Python爬虫如何通过post获取网站的数据?

热门文章

  1. 极性电容为什么具有单向导电性(阀金属与氧化膜)
  2. 两个基于爬虫的项目: Kiwix ArchiveBox
  3. Java学习日记:set集合(不多用)
  4. 如何在APP中集成Google账户登录
  5. 学习了那么多SEO大神的教程,为什么你的网站还是没有排名呢?
  6. 数字电路技术可能出现的简答题_电子技术应用实验1(数字电路基础实验)答案公众号...
  7. matlab非线性优化求解,用MATLAB求解非线性优化问题
  8. UEFI小结-Handle的来龙去脉
  9. Codeforces 718E.Matvey's Birthday dp+状态压缩
  10. 面向卫星互联网的层级化智能部署架构