洛谷P1549 棋盘问题(2)
P1549 棋盘问题(2)
题目描述
在N*N的棋盘上(1≤N≤10),填入1,2,…,N*N共N*N个数,使得任意两个相邻的数之和为素数。
例如:当N=2时,有:
其相邻数的和为素数的有:
1+2,1+4,4+3,2+3
当N=4时,一种可以填写的方案如下:
在这里我们约定:左上角的格子里必须填数字1。
输入输出格式
输入格式:
一个数N
输出格式:
如有多种解,则输出第一行、第一列之和为最小的排列方案;若无解,则输出“NO”。
输入输出样例
1
NO
2
1 2
4 3
#include<iostream>
#include<cstdio>
using namespace std;
int n,map[][],p[],cnt;
int ok[][];
bool th[],vis[],flag;
void dfs(int x,int y){
if(x==n+){
flag=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
cout<<map[i][j]<<' ';
}cout<<endl;
}
}
if(flag)return;
int pre1,pre2;
if(x==)pre1=pre2=map[x][y-];
else if(y==)pre1=pre2=map[x-][y];
else pre1=map[x-][y],pre2=map[x][y-];
int nxt1=x,nxt2=y+;
if(nxt2>n)nxt2=,nxt1=x+;
for(int i=;i<=ok[pre1][];i++){
int now=ok[pre1][i];
if(!th[now+pre2]&&!vis[now]){
vis[now]=;
map[x][y]=now;
dfs(nxt1,nxt2);
vis[now]=;
}
}
}
int main(){
scanf("%d",&n);
if(n==){
printf("NO");
return ;
}
th[]=;
for(int i=;i<=;i++){
if(!th[i])p[++cnt]=i;
for(int j=;j<=cnt&&i*p[j]<=;j++){
th[i*p[j]]=;
if(i%p[j]==)break;
}
}
for(int i=;i<=n*n;i++)
for(int j=;j<=cnt;j++){
int to=p[j]-i;
if(to>n*n)break;
if(to>)ok[i][++ok[i][]]=to;
}
vis[]=;
map[][]=;
dfs(,);
if(flag==){
printf("NO");
return ;
}
}
60分 输出顺序不行,WA两个点
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
if(n == ) cout << "1 2" << endl << "4 3";
else if(n == ) cout << "1 2 11 12" << endl << "4 15 8 5" << endl << "7 16 3 14" << endl << "6 13 10 9";
else if(n == ) cout << "1 2 3 4 7" << endl << "6 5 14 15 16" << endl << "13 24 23 8 21" << endl << "10 19 18 11 20" << endl << "9 22 25 12 17";
else cout << "NO";
return ;
}
100分 数据范围小,可以打表
洛谷P1549 棋盘问题(2)的更多相关文章
- 洛谷——P1549 棋盘问题(2)
P1549 棋盘问题(2) 搜索||打表 #include<cstdio> #include<cstring> #include<iostream> #includ ...
- 2017普及组D1T3 洛谷P3956 棋盘
2017普及组D1T3 洛谷P3956 棋盘 原题 题目描述 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在 ...
- 洛谷 P3956 棋盘 解题报告
P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...
- 洛谷P1436 棋盘分割
洛谷题目链接 动态规划: 我们设状态$f[i][j][o][p][k]$表示一个矩形,左上角顶点坐标为$(i,j)$,右下角顶点坐标为$(o,p)$时分割了$k$次,也就是说现在是$k+1$块 我们考 ...
- 洛谷 P1436 棋盘分割 解题报告
P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...
- 洛谷 P1548 棋盘问题
题目描述 设有一个N*M方格的棋盘(l<=N<=100,1<=M<=100)(30%) 求出该棋盘中包含有多少个正方形.多少个长方形(不包括正方形). 例如:当 N=2, M= ...
- 洛谷——P1548 棋盘问题
https://www.luogu.org/problem/show?pid=1548#sub 题目描述 设有一个N*M方格的棋盘(l<=N<=100,1<=M<=100)(3 ...
- 洛谷 P3956 棋盘
题目描述 有一个m ×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的), 你只能向上 ...
- 洛谷P1169 棋盘制作(悬线法)
题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ...
随机推荐
- ABAP 数值转换大写
转自:http://www.dasunny.com/wordpress/sapnotes/2015113091.htmlSAP标准的数值转换函数 SPELL_AMOUNT, 仅对整数部分进行了处理,小 ...
- 服务器安装tensorflow导入模块报错Illegal instruction (core dumped)
在ubuntu上安装tensorflow后导入模块显示Illegal instruction (core dumped) 服务器的版本是Ubuntu 16.04.5 降低版本,成功导入模块 pip3 ...
- JAVA-关键字&标识符
关键字: 关键字就是在java程序中具备特殊含义的标识符.关键字一般用于描述一个程序的结构或者表示数据类型.他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. ...
- css3立体旋转菜单
css3立体旋转菜单,css3,3D,立体旋转,立体菜单,菜单导航,css3立体旋转菜单是一款纯css3实现的三维立体旋转导航菜单. 源码下载页:http://www.huiyi8.com/sc/71 ...
- linux应用之yum命令
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...
- str_2.判断两个字符串是否互为旋转词
1. 字符串str的前面任意部分挪到后面形成的字符串叫做字符串str的旋转词 $str1 = "2ab1"; $str2 = "ab12"; $ret = is ...
- leetcode 43. Multiply Strings(高精度乘法)
Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...
- 机器学习: R-CNN, Fast R-CNN and Faster R-CNN
做语义分割的大概都知道这几篇文章了,将一个传统的计算机视觉模型,用CNN一点一点的替换,直到最后构建了一个完整的基于CNN的端到端的模型.这几篇文章有一定的连贯性.从中可以看到一种研究的趋势走向. 上 ...
- NPM 在MacOSX中的使用技巧
经常看到有人说『为啥npm install 的时候报错,显示EACCESS错误…』,之前大家都是sudo大法解决问题,也没太在意. 至于这个问题是brew安装工具的时候造成的,还是系统修改磁盘权限造成 ...
- bzoj4555: 求和sum 快速傅立叶变换
题目大意 给定\(S(n,m)\)表示第二类斯特林数,定义函数\(f(n)\) \[f(n) = \sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*(j!)\] 给定正整数\(n, ...