博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 906B. Seating of Students(构造+DFS)
阅读量:5105 次
发布时间:2019-06-13

本文共 1427 字,大约阅读时间需要 4 分钟。

  行和列>4的可以直接构造,只要交叉着放就好了,比如1 3 5 2 4和2 4 1 3 5,每一行和下一行用不同的方法就能保证没有邻居。

  其他的可以用爆搜,每次暴力和后面的一个编号交换并判断可行性。

  写dfs的话其实行和列>4的就不用刻意构造了,这个dfs方法可以$O(n*m)$跑出一个构造方案。

#include
#include
#include
#include
#define ll long longusing 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};inline void read(int &k){ int f=1; k=0; char c=getchar(); while(c<'0' || c>'9') c=='-' && (f=-1), c=getchar(); while(c<='9' && c>='0') k=k*10+c-'0', c=getchar(); k*=f;}bool check(int i, int j){ int x=(i-1)/m+1, y=(i-1)%m+1, x2=(j-1)/m+1, y2=(j-1)%m+1; for(int k=0;k<4;k++) if(x+dx[k]==x2 && y+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(){ read(n); read(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)) return puts("NO"), 0; puts("YES"); for(int i=1;i<=n;i++, puts("")) for(int j=1;j<=m;j++) printf("%d ", pos[(i-1)*m+j]);}
View Code

 

转载于:https://www.cnblogs.com/Sakits/p/8099234.html

你可能感兴趣的文章
iframe跨域与session失效问题
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
Hash和Bloom Filter
查看>>
SQL Server获取月度列表
查看>>
python常用函数
查看>>
python 描点画圆
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
pycharm 如何设置方法调用字体颜色
查看>>
VUE源码解析心得
查看>>
[HDU3683 Gomoku]
查看>>
【工具相关】iOS-Reveal的使用
查看>>
整体二分——[Poi2011]Meteors
查看>>
数据库3
查看>>
delphi之事件
查看>>
windows server 2008 r2 安装
查看>>
存储分类
查看>>
下一代操作系统与软件
查看>>