程序员的算法趣题Q68: 异性相邻的座位安排(1)
目录
1. 问题描述
2. 解题分析
3. 代码及测试
4. 后记
1. 问题描述
这道题的描述应该是有问题的(不知道是原文的问题还是翻译的问题)。
前面的描述中提到“前后左右的座位全是异性”和NG示例中的“前后左右全是同性”两种情况。问题中所要求满足的“上述条件”是什么呢?仅从上下文来看第一感当然是说“前后左右的座位全是异性”。但是仔细一想就知道这个不对,每个座位的“前后左右的座位都是异性”的安排情况只有两种。
“前后左右的座位全是异性”和“前后左右全是同性”的两种极端情况之间还有巨大的灰色空间。问题的原意应该是指满足“任何一个座位的前后左右不全是同性(或至少有一个异性)”的情况吧?
2. 解题分析
先考虑一个基本方案。
从搜索方式来说,这个问题与前面的Q32和Q59等题有类似之处。只需要基于Q32或Q59的基本框架略作修改即可。
要点说明:
- 与Q32, Q59一样,逐行扫描,每次向右移一格。右边到头即移到下一格。到达最下边的围栏行则表明已经完成一次搜索,找到一个合规的安排方案
- “违规检查”只需要针对当前座位的左边座位和上边座位,这是因为扫描是向右、下方向进行的,当前座位的右边和下边还没有安排人,所以右边座位和下边座位肯定还没有违规
- 最后还必须满足男生和女生人数都必须相等
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)相关推荐
- php算法求出一个数可以被分解成多少个_程序员的算法趣题
计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...
- 程序员的算法趣题Q67: 不挨着坐是一种礼节吗?
目录 1. 问题描述 2. 解题分析 2.1 基本思路 2.2 动态规划 2.3 算法流程 3. 代码及测试 4. 后记 1. 问题描述 注意,本问题不区分人,只考虑各个座位被占用的不同顺序的个数. ...
- 程序员的算法趣题Q66: 设计填字游戏
目录 1. 问题描述 2. 解题分析 2.1 基本算法流程 2.2 连通性检查 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 与前面的Q32.Q59以及后面的Q68(碰巧先做了Q68) ...
- LeetBook《程序员的算法趣题》Q18---水果酥饼日
<程序员的算法趣题>-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言. Q18 水果酥饼日 日本每月的 22 日是水果酥 ...
- 程序员的算法趣题Q50: 完美洗牌
目录 1. 问题描述 2. 解题分析 2.1 思路1 2.2 思路2 3. 代码及测试 4. 后记 1. 问题描述 问题:对2n张牌洗牌,并求当1<=n<=100时,一共有多少个n可以使得 ...
- 程序员的算法趣题Q09: 落单的男女
目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 思考 1. 问题描述 人们聚集在某个活动会场上,根据到场顺序排成一排等待入场,活动的主办人员,想把人们从队列的某个位置分成两组,想要让分开 ...
- 程序员的算法趣题Q55: 平分蛋糕
目录 1. 问题描述 2. 解题分析 2.1 初始算法流程 2.2 优化 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 这个题目第一感就是动态规划. 对于(m, n)形状(如下图所示, ...
- 程序员的算法趣题Q57: 最快的联络网
目录 1. 问题描述 2. 解题分析 2.1 学生的状态 2.2 学生状态转移 Case-T1:Do nothing, just wait Case-T2:给处于S0状态的学生打电话 Case-T3: ...
- 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)
题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...
最新文章
- 使用SVG中的Symbol元素制作Icon
- 给web请求加遮罩动画
- 算法:串联所有单词的子串
- Mysql读写分离php脚本
- php cookie 二级域名,php如何设置cookie对整个域名有效及二级域名
- 字节跳动和腾讯不正当竞争案将于深圳开庭 抖音:我们也是看新闻才知道本月24日要开庭...
- maven使用mvn命令创建项目异常java.lang.NoClassDefFoundError: org/apache/commons/collections/ExtendedProperties
- Login as Root in Ubuntu 12.10
- 武汉理工大学-数值分析-2019年期末复习提纲
- 旋转矩阵与四元数的理解
- 2022-4-16 c++ 杂记 mutex GUARDED_BY std::unique_ptr unordered_map ::开头
- PHP的implode函数运用,什么是PHP中的implode()函数?
- 南开大学张昊计算机,纽约南开校友会隆重举办纪念南开大学建校100周年庆典
- 如何查看docker的版本号是多少
- 计算机求职简历考试题题大学,大学计算机基础上机实验指导与习题,word的设计性实-个人简历.docx...
- Java基础50题(3) 21~30题
- arcgis终结时间表
- 报告上集 | 《认文识字·中文字信息精准化》报告
- Openwrt动态域名解析
- python如何爬虫eps数据_Python爬虫如何通过post获取网站的数据?
热门文章
- 极性电容为什么具有单向导电性(阀金属与氧化膜)
- 两个基于爬虫的项目: Kiwix ArchiveBox
- Java学习日记:set集合(不多用)
- 如何在APP中集成Google账户登录
- 学习了那么多SEO大神的教程,为什么你的网站还是没有排名呢?
- 数字电路技术可能出现的简答题_电子技术应用实验1(数字电路基础实验)答案公众号...
- matlab非线性优化求解,用MATLAB求解非线性优化问题
- UEFI小结-Handle的来龙去脉
- Codeforces 718E.Matvey's Birthday dp+状态压缩
- 面向卫星互联网的层级化智能部署架构