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:

1
输出样例#1:

NO
输入样例#2:

2
输出样例#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)的更多相关文章

  1. 洛谷——P1549 棋盘问题(2)

    P1549 棋盘问题(2) 搜索||打表 #include<cstdio> #include<cstring> #include<iostream> #includ ...

  2. 2017普及组D1T3 洛谷P3956 棋盘

    2017普及组D1T3 洛谷P3956 棋盘 原题 题目描述 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在 ...

  3. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

  4. 洛谷P1436 棋盘分割

    洛谷题目链接 动态规划: 我们设状态$f[i][j][o][p][k]$表示一个矩形,左上角顶点坐标为$(i,j)$,右下角顶点坐标为$(o,p)$时分割了$k$次,也就是说现在是$k+1$块 我们考 ...

  5. 洛谷 P1436 棋盘分割 解题报告

    P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...

  6. 洛谷 P1548 棋盘问题

    题目描述 设有一个N*M方格的棋盘(l<=N<=100,1<=M<=100)(30%) 求出该棋盘中包含有多少个正方形.多少个长方形(不包括正方形). 例如:当 N=2, M= ...

  7. 洛谷——P1548 棋盘问题

    https://www.luogu.org/problem/show?pid=1548#sub 题目描述 设有一个N*M方格的棋盘(l<=N<=100,1<=M<=100)(3 ...

  8. 洛谷 P3956 棋盘

    题目描述 有一个m ×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的), 你只能向上 ...

  9. 洛谷P1169 棋盘制作(悬线法)

    题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ...

随机推荐

  1. ABAP screen

    Instance One : SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-100. SELECTION-SCREEN BEGIN ...

  2. uboot 2013.01 代码简析(2)第一阶段初始化

    uboot执行"make smdk2410_config"之后就可以进行编译了,可以执行make命令进行编译, 因为整个输出太长,我仅仅列出部分最关键的输出(部分我不关心的内容直接 ...

  3. 学习html第一天

    网站本身就是软件,软件:一种具有特定功能的程序指令的集合 C/S:C客户端-->S服务器  由程序员开发  客户去下载升级安装,比如魔兽世界 B/S:B浏览器-->S服务器  由程序员开发 ...

  4. ansible mysql模块的使用今年

    摘自: https://www.ibm.com/developerworks/cn/linux/1502_lih_ansible/

  5. Linux学习之路(二)文件处理命令之下

    分区格式化: 一块分区想要使用的话,要格式化.格式化主要有两个工作,1,把分区分成等大小的数据块,每个数据块一般为4KB.2在分区之前建一个分区表,给第一个文件建一行相关数据,在分区表里保存了它的io ...

  6. BZOJ 1651 [Usaco2006 Feb]Stall Reservations 专用牛棚:优先队列【线段最大重叠层数】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1651 题意: 给你n个线段[a,b],问你这些线段重叠最多的地方有几层. 题解: 先将线段 ...

  7. multitail

    multitail 在分隔的窗口查看你的日志

  8. JXL 的API

    使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事.在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来 ...

  9. 【Matlab】常用函数

    1.取整函数 ceil(x)返回不小于x的最小整数值.floor(x)返回不大于x的最大整数值.round(x)返回x的四舍五入整数值.

  10. finetune

    微调的具体方法和技巧有很多种,这里总结了在不同场景下的微调技巧: 1)新数据集比较小且和原数据集相似.因为新数据集比较小(比如<5000),如果fine-tune可能会过拟合:又因为新旧数据集类 ...