Seating of Students (dfs模拟+思维)

量化人必看|miniQMT踩坑记:回测太慢?一招教你把行情数据“搬回家”! 这篇文章主要聊的是。 阅读详情

Seating of Students

Students went into a class to write a test and sat in some way. The teacher thought: "Probably they sat in this order to copy works of each other. I need to rearrange them in such a way that students that were neighbors are not neighbors in a new seating."

The class can be represented as a matrix with n rows and m columns with a student in each cell. Two students are neighbors if cells in which they sit have a common side.

Let's enumerate students from 1 to n·m in order of rows. So a student who initially sits in the cell in row i and column j has a number (i - 1)·m + j. You have to find a matrix with n rows and m columns in which all numbers from 1 to n·m appear exactly once and adjacent numbers in the original matrix are not adjacent in it, or determine that there is no such matrix.


Input

The only line contains two integers n and m (1 ≤ n, m ≤ 105; n·m ≤ 105) — the number of rows and the number of columns in the required matrix.

Output

If there is no such matrix, output "NO" (without quotes).

Otherwise in the first line output "YES" (without quotes), and in the next n lines output m integers which form the required matrix.

Examples
Input
2 4
Output
YES
5 4 7 2 
3 6 1 8 
Input
2 1
Output
NO
Note

In the first test case the matrix initially looks like this:

1 2 3 4
5 6 7 8

It's easy to see that there are no two students that are adjacent in both matrices.

In the second test case there are only two possible seatings and in both of them students with numbers 1 and 2 are neighbors.

这是一道比较有难度的模拟题

题意:给你一个n*m矩阵,里面数字顺序从1-n*m,

1 2 3 4

5 6 7 8……

……

问我们能不能输出一个矩阵使得原有数字都不相邻,可以输出YES并输出满足的矩阵,否则输出NO

思路:根据题目所给的数据范围我们知道肯定不能用二维数组储存数字然后dfs搜索遍历,而是直接进行模拟遍历,题目给了一个公式(i - 1)·m + j。也就是如果我们知道了矩阵中的位置(i,j)那这个位置原始数字应该是(i-1)*m+j,那么反过来如果我们知道了一个数字如果得到这个数字的原始在矩阵中的位置呢如果已知数字大小是i那么这个数字在矩阵的初始位置x = (i-1)/m+1

y = (i-1) % m +1,(x,y)就是初始位置,有了这个我们就不需要用二维数组储存了,直接用一维数组储存就行了。怎么存呢?就是还是用二次循环和储存二维数组一样,只不过把i,j根据公式转成数字存在一维数组中。然后dfs,参数是就是从1-n*m数字,

然后转成(x,y)坐标后我们就也可以得到它的上方和左方的坐标,然后看是否和当前要放的数字相邻(因为我们根据公式算出的坐标都是在原始顺序矩阵中的坐标所以如果坐标相邻说明放上的数字还是相邻的所以不行),为什么只判断上方和左方呢,因为我们是顺序搜索一个一个的放,下方和右方还没有放,所以只判断放好的数字是否相邻就行。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 5e5+10;
int n,m;
int pos[maxn];
int dx[4] = {0,1,0,-1}, dy[4] = {1,0,-1,0};
bool check(int i,int j){
    int x1 = (i - 1) / m + 1;
    int y1 = (i - 1) % m + 1;
    int x2 = (j - 1) / m + 1;
    int y2 = (j - 1) % m + 1;
    for(int k = 0; k < 4; k++){
        if(x1 + dx[k] == x2 && y1 + dy[k] == y2)
            return 1;
    }
    return 0;
}

bool dfs(int i){
    if(i == n * m + 1)
        return 1;
    int x = (i - 1) / m + 1, y = (i - 1) % m + 1;
    for(int j = i; j <= n * m; j++){
        swap(pos[i],pos[j]);
        if(x != 1 && check(pos[i],pos[(x - 2) * m + y]))
            continue;
        if(y != 1 && check(pos[i],pos[(x - 1) * m + y - 1]))
            continue;
        if(dfs(i+1))
            return 1;
        swap(pos[i],pos[j]);
    }
    return 0;
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            pos[(i - 1) * m + j] = (i - 1) * m + j;
        }
    }
    if(!dfs(1)){
        puts("NO");
        return 0;
    }
    puts("YES");
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(j == 1)
                printf("%d",pos[(i - 1) * m + j]);
            else
                printf(" %d",pos[(i - 1) * m + j]);
        }
        puts("");
    }
    return 0;
}

YOLOv8改进:注意力系列篇 |高效的通道先验卷积注意力(CPCA) | 中科院 2023.6 高效的通道先验卷积注意力(CPCA)方法,支持注意力权重在通道和空间维度上的动态分布; 阅读详情

相关推荐

Docker入门教程:在腾讯云轻量服务器上部署你的第一个容器化应用 (2025)

还在为“在我电脑上明明是好的”而烦恼?本篇Docker入门教程,用通俗易懂的比喻解释镜像、容器的核心概念,并手把手带你在腾讯云轻量服务器上,从运行Nginx到编写Dockerfile打包自己的Python应用,轻松掌握容器化部署。

Clownseven的博客 2082

Codeforces 906B. Seating of Students(构造+DFS)

  行和列>4的可以直接构造,只要交叉着放就好了,比如1 3 5 2 4和2 4 1 3 5,每一行和下一行用不同的方法就能保证没有邻居。   其他的可以用爆搜,每次暴力和后面的一个编号交换并判断可行性。   写dfs的话其实行和列>4的就不用刻意构造了,这个dfs方法可以$O(n*m)$跑出一个构造方案。 #include<iostream> #inclu...

weixin_30684743的博客 182

Foxmail 7.2.25以下版本XSS漏洞实战复现:手把手教你如何构造恶意邮件(含防御方案)

本文深入解析Foxmail 7.2.25以下版本的XSS漏洞(CNVD-2025-06036),详细展示如何构造恶意邮件进行跨站脚本攻击,并提供从客户端升级到企业级防护的多层次防御方案,帮助用户有效防范安全风险。

view3的博客 163

CodeForces - 906C Seating of Students B

B. Seating of Studentstime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputStudents went into a class to write a test and sat in some way. The teacher ...

柳予欣的三味书屋~ 576

滚动时域优化方法

滚动时域优化(Receding Horizon Optimization, RHO),也被广泛称为模型预测控制(Model Predictive Control, MPC),是一种用于动态系统优化和控制的。其核心思想是“在每个当前时刻k,控制器只考虑未来一个(称为“预测时域”或“优化时域”,长度N)内的系统行为。(通过测量或估计得到)。(描述状态如何随输入和干扰变化)。(如果有,可能基于历史数据或假设)。在这个有限的未来时域[k, k+N-1]上,求解一个。这个优化问题的目标是找到一个。

m0_69522810的博客 2289

Python自动化监控:实时捕捉LOF基金溢价套利机会并微信预警

本文详细介绍了如何使用Python构建一个自动化监控系统,实时捕捉LOF基金的溢价套利机会。通过AKShare获取基金数据,结合雪球API计算实时溢价率,并利用企业微信API实现微信推送预警,帮助投资者高效、自动地发现并抓住转瞬即逝的套利机会。

weixin_28327051的博客 522

CodeForces 906B Seating of Students【dfs】

题解给出了一个比较巧妙的构造的方法,但是这个题也可以直接dfs去做,只考虑不与前面的安排好的左边以及上面的数有相邻,那么就可以往下一直dfs,这样的复杂度约是 O(n*m)^2 #include &amp;lt;bits/stdc++.h&amp;gt; #define cl(a) memset(a,0,sizeof(a)) #define ll long long #define pb(i) push_bac...

beckyUp的博客 331

微信公众号开发实战:如何高效推送模板消息(附完整代码示例)

本文详细解析了微信公众号开发中模板消息推送的核心流程与实战技巧。文章从OpenID获取、模板申请、Access Token缓存管理到完整PHP代码实现,逐步拆解了高效推送模板消息的关键步骤,并提供了可直接复用的代码示例,帮助开发者快速集成这一提升用户体验的重要功能。

weixin_29009971的博客 792

Codeforces Round #454 D. Seating of Students

构造/随机化

OZY的博客 530

STM32 HAL 模拟I2C从机实战:软件实现与多设备通信优化

本文详细介绍了STM32 HAL库下软件模拟I2C从机的实现方法,包括GPIO开漏配置、基础信号实现、数据收发函数编写和多设备通信优化策略。通过灵活的软件模拟方案,解决了硬件I2C接口数量限制和稳定性问题,为多传感器数据采集等应用提供了可靠的通信保障。

motor的博客 911

FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测

当前,多模态假新闻的大量涌现导致了显著的分布差异,这一现状亟需我们开发具备广泛适用性的检测器。然而,现有假新闻检测器因特定领域内的训练方式,难以有效获取开放世界中的事实信息。这种训练的封闭性限制了传统检测器的能力,特别是在面对跨域假新闻时,其表现往往不尽如人意。具体而言,开放世界中的假新闻在两个方面具有显著的分布差异:一方面,其操纵内容多种多样,新闻的任一部分都可能受到创意策略的操控;另一方面,真实背景复杂多变,不同地区的新闻背景和主题焦点存在显著差异。

qq_52053775的博客 821

codeforces 906 B. Seating of Students

#include using namespace std; const int maxn = 500010; int n, m; int pos[maxn]; int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 }; bool check(int i, int j) { int x = (i - 1) / m + 1, y = (i - 1)

Egqawkq的博客 915

15、SQL Server查询优化与CPU负载管理

本文深入探讨了SQL Server查询优化与CPU负载管理的关键技术,包括强制连接类型的使用、键查找问题的解决、索引设计的最佳实践、高CPU负载的排查与优化,以及并行性的利弊与调整策略。通过优化查询逻辑、合理设计索引、监控与管理CPU资源,可以显著提升SQL Server的性能和稳定性。适用于数据库开发人员和DBA进行性能调优参考。

pz8901234的博客 76

CF 906B - Seating of Students 随机 乱搞 技巧

题意: 给你一个N * M 的表,第i行j列的数是 (i - 1) * m + j,现在要重新安排数的位置,问你有没有一种方案使得原来相邻的数现在不相邻。 题解: 随机乱搞。 给了两秒,我们设置程序执行了1.9秒时退出随机,输出NO。 while (clock() &lt; 1.9 * CLOCKS_PER_SEC) 一开始直接用random_suffle,暴力判断当前是否可行,如果不...

c6376315qqso的专栏 429

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[非题解]Codeforces Round #454 (Div. 2) D. Seating of Students

这题是错的…虽然不知道哪里错了,还是贴下来吧…#include <iostream> #include <queue> using namespace std; queue<int> outp[100000]; void solve(int n,int m){ int tem,i,j; for(i=1;i<=n;i++){ tem=(i-1)*m+1;

Myriad Dreamin 愿逐将属于我的奇迹 422

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

761E Dasha and Puzzle[dfs][思维]

E. Dasha and Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Dasha decided to have a rest after solv

Qer的博客 400

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Codeforces 711D Directed Roads【Dfs+思维】

D. Directed Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output ZS the Coder and Chris the Baboon has explored Uday

mengxiang000000 723

CSU-1508 地图的四着色【Bfs+Dfs+思维剪枝】

1508: 地图的四着色 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 164  Solved: 74 [Submit][Status] Description 有一个R行C列的网格地图,每个国家是一个四连通区域。你的任务是用红,绿,蓝,黄四种颜色给地图着色,使得相邻国家的颜色不同。 一个人着色比较无趣,所以你想请女朋友陪你一

mengxiang000000 1337

HDU 5296 Annoying problem(LCA+DFS序+思维)

Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1906    Accepted Submission(s): 632   Problem Description Coco has a tree,...

LSD20164388的博客 426

DFS+思维-PKU Online Judge-1054:Cube

题目链接: http://poj.openjudge.cn/practice/1054/ 题目意思: 在2D空间里,有N个村庄,有N-1条路(所有的路都是水平或竖直的),使得N个村庄两两间都连通。有一个正方体,每次可以沿着路像上下左右滚动一格,如果正方体从村庄A出发滚,滚到村庄B后的六个面的状态和开始在村庄A的状态一样,则记村庄A和村庄B具有关系,求每个的村庄i,求出于它有关系的村庄的个

cc_again的专栏 1151

hiboCoder 1041 国庆出游 dfs+思维

先抽象出一棵以1做为根结点的树。给定了访问序列a[1..m]。 考虑两种特殊情况: 1.访问了某个a[j],但是存在a[i]没有访问且i 2.当某个点被访问后并且这个节点被回溯之后,它的子树中仍然存在序列中的节点没被访问,那么些节点不会有机会再被访问,不符合情况。 思路:根据访问序列中节点的下标,给定所有待访问节点一个权值,代表他们的访问顺序,例如数据: 7 1 2 1 3 2

flyawayl的博客 679

深度优先搜索(DFS)-例题附思路-总结(一)

关于DFS的定义等基本的东西我就不说了~百度吧。 每个人的学习方法不一样,在我的学习中我是把DFS是分了类的,虽然总体思路是一样的,但是不同的应用环境就会应用不同的DFS模型,是的,模型。 下面我把目前博主做过并总结的模型挨着说一下。这篇先说第一种,其他的博主会在后面的DFS系列博文里面说的。(我会加油写的~~) 直接上题: 模型一: 1、标题:六角填数

奋斗的蜗牛 2万+

OpenJ_Bailian - 2787 算24 【思维 + dfs】

传送门思路 : 因为要问是否可以算出, 所以需要把所有可能性都列出来, 自然就要想到搜素赛.AC Code#include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<cstring> #define db double #define CLR(x) memset(x,0,sizeof(x)) usi

Anxdada -- 我等风来也等你 1098

wannafly10 c题 dfs+思路

这道题开始先直接dfs,然后tle了,然后换汤不换药bfs一遍,又tle了。看了别人的思路,恍然大悟。TLE思路:建图,然后对于每次轰炸,以轰炸的节点为根进行dfs,更新相邻节点损毁的次数。TLE写起来简单粗暴,但结果也很粗暴。。。AC思路:建图后先进行一次dfs(以编号为1的节点为根,将无根树转为有根树)找出每个节点对应的父节点,然后根据父子关系,爷孙关系以及兄弟关系,推出节点的损毁次数。(兄弟...

RockyHOO1209的博客 318

USACO 2.2 Party Lamps___dfs+思维

题目大意: 有N盏彩色灯,他们分别从1到N被标上号码。 按下按钮1后,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。 按下按钮2后:当按下此按钮,将改变所有奇数号的灯。 按下按钮3后:当按下此按钮,将改变所有偶数号的灯。 按下按钮4后:当按下此按钮,将改变所有序号是3*K+1的灯。例如:1,4,7… 一个计数器C记录按钮被按下的次数。 当宴会开始,所有的灯都亮...

生如夏花之绚烂 440

ZJCOJ:qwb和李主席(DFS & 思维)

Problem E: qwb和李主席 Time Limit: 4 Sec  Memory Limit: 128 MB Submit: 360  Solved: 34 [Submit][Status][Web Board] Description qwb和李主席打算平分一堆宝藏,他们想确保分配公平,可惜他们都太懒了,你能帮助他们嘛? Input 输入包含多组

junior19的博客 525
上一篇: Shooting Game FZU - 2144 区间覆盖贪心
下一篇: Tic-Tac-Toe (模拟)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值