题意

在N×N的棋盘上(1≤N≤10),填入1,2,…,N^2,共N^2个数,使得任意两个相邻的数之和为素数。

思路

先线性筛(非标准版),然后用a数组记录以i为下标的数是不是质数(就是标记数组),然后就可以搜了,加个vis数组记录此数有没有被搜过。
用f数组记录当前答案(因为第一个搜到的不一定是最优的),用sum记录第一行与第一列的和,如果大于MINN就退出。
然后你就会发现过不了。
接下来就是玄学剪枝了,加个TIM记录答案更新时间,如果长时间未更新就直接退出,然后之后不用输出,但如果可以搜出就等dfs完再输出。
提前判断NO情况只是为了加快速度而已(想拿第一页),但谁知都是神仙打表巨佬(0ms的那种)。
细节看代码
依旧n==10跑不动辣

代码

#include<bits/stdc++.h>
using namespace std;
int f[15][15],ans[15][15],a[205],n,vis[105],MINN=999999,TIM=0,flag=0;//a开这么多因为n*n*2-1最大只有199
inline void dfs(int step)
{
    if (step>n*n)
    {
    TIM++;
    if (TIM>10)
    {
        flag=1;
        for (int i=1;i<=n;i++)
         {
            for (int j=1;j<=n;j++)
             cout<<ans[i][j]<<" ";
             cout<<endl;
         }
         exit(0);
         return;//多余,个人习惯
    }
    int sum=0;
    for (int i=1;i<=n;i++) sum+=f[1][i]+f[i][1];
    if (MINN<=sum) return;//80分看过来
    MINN=sum;
    TIM=0;
    for (int i=1;i<=n;i++)for (int j=1;j<=n;j++) ans[i][j]=f[i][j];
    return;
    }
    int x=(step-1)/n+1;
    int y=(step-1)%n+1;//常规,本人习惯这么打
    for (int i=1;i<=n*n;i++)
    {
        if ((a[f[x-1][y]+i]==1||f[x-1][y]==-1)&&(a[f[x][y-1]+i]==1||f[x][y-1]==-1)&&(a[f[x+1][y]+i]==1||f[x+1][y]==-1)&&(a[f[x][y+1]+i]==1||f[x][y+1]==-1)&&vis[i]==0)//看,很方便吧(逃
        {
        vis[i]=1;
        f[x][y]=i;
        dfs(step+1);
        f[x][y]=-1;
        vis[i]=0;
        }
    }
}
void slove()
{
 int m=2*n*n;
 for (int i=2;i<=m;i++) a[i]=1;
 a[1]=0;
 for (int i=2;i<=m;i++) if (a[i]==1) for (int j=2;j<=m/i+1;j++) a[i*j]=0;
 //for (int i=1;i<=n;i++) cout<<i<<" "<<a[i]<<endl;
}
int main()
{
 //freopen("1.out","w",stdout);
 cin>>n;
 if (n==1||n==3||n==9) {cout<<"NO"<<endl;return 0;}
 slove();
 for (int i=0;i<=n+1;i++)for (int j=0;j<=n+1;j++)f[i][j]=-1;//这样判断边缘要方便许多,但如果n==1要特判。。。
 dfs(1);
 if (flag==0)
 {
    for (int i=1;i<=n;i++)
         {
            for (int j=1;j<=n;j++)
             cout<<ans[i][j]<<" ";
             cout<<endl;
         }
 }
 return 0;
} 

Luogu P1549 棋盘问题(2)的更多相关文章

  1. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  2. luogu 1169 棋盘制作(单调栈/悬线)

    luogu 1169 棋盘制作(单调栈/悬线) 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应 ...

  3. 洛谷P1549 棋盘问题(2)

    P1549 棋盘问题(2) 题目描述 在N*N的棋盘上(1≤N≤10),填入1,2,…,N*N共N*N个数,使得任意两个相邻的数之和为素数. 例如:当N=2时,有: 其相邻数的和为素数的有: 1+2, ...

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

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

  5. Luogu P1436 棋盘分割 暴力DP

    我的天,,,,,n=8,k<=15,,,这怕不是暴力DP+高维数组.... 开一个五维数组f[k][i][j][p][q]表示从(i,j)到(p,q)中分成k个矩形最小的平方和. 然后初始化时用 ...

  6. [POJ] 1191 [LUOGU] P1436 棋盘分割

    那个均方差,可以通过展开.合并Σ,发现最终只有Xi^2会对答案造成影响,其他都是定值,所以求出最小的和的平方就行. 其实这才是这题最难的部分,以下都是码农部分. f[x1][y1][x2][y2][k ...

  7. 杂项 List

    题目 1. 栈    #A 表达式的转换 (Unaccepted) 2. STL 模板库 #B 双栈排序(Unaccepted)    #C 垃圾陷阱(Accepted)    #D 合并果子(Acc ...

  8. [P1169] 棋盘制作 &悬线法学习笔记

    学习笔记 悬线法 最大子矩阵问题: 在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的,边与整个矩形平行或重合的最大子矩形. 极大子矩型:无法再向外拓展的有效子矩形 最大子矩型:最大的一个有效子矩 ...

  9. 历年NOIP题

    做了几天远古老题,发现不可做,于是咕掉..转而从2005开始.. 1997: P1549 棋盘问题(2):搜索,优化搜索顺序,对于第一行第一列先搜小的(但是其实这样是错的,仅仅能过原题) 加强版咕. ...

随机推荐

  1. 【刷题】LOJ 6122 「网络流 24 题」航空路线问题

    题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单向从西向东途经若干城市到达最东端城市,然后再单向 ...

  2. 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)

    洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...

  3. emWin 工程之汉字显示

    @2018-7-10  工程加入字库后,液晶屏显示非法文字,无法正确显示设置的文字 解决办法 将显示汉字的文件 <MainTask.c> 修改为 UTF-8 格式后显示正常,修改为 ANS ...

  4. 自动化运维工之Ansible(1)

    1.1 ansible简介 1.1.1 .Ansible软件介绍: Ansible提供一种最简单的方式用于发布.管理和编排计算机系统的工具,可在数分钟内搞定.Ansible由Python语言开发, 默 ...

  5. spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置

    spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...

  6. dwr网上使用例子

    转: dwr实现聊天室功能 2016年01月15日 10:22:43 我爱喝可乐 阅读数:564   用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无 ...

  7. OpenStack 计算服务 Nova计算节点部署(八)

    如果使用vmware虚拟机进行部署,需要开启虚拟化:如果是服务器需要在bios上开启. nova计算节点IP是192.168.137.12 环境准备 安装时间同步 yum install ntpdat ...

  8. BFC的个人理解

    BFC是Block Formatting Context (块级格式化上下文)的缩写,是一个独立的渲染区域,这个东西的存在是为了隔绝一些内部子元素对外部元素的影响. 例如: 我们用overflow:h ...

  9. P3173 [HAOI2009]巧克力 && P1324 矩形分割

    题目描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块. 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价. ...

  10. Java基础-使用JAVA代码剖析MD5算法实现过程

    Java基础-使用JAVA代码剖析MD5算法实现过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.