P1549 棋盘问题(2)

搜索||打表

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib> using namespace std; int n,p[][],an[][],hang,lie,ans[][];
bool vi[]; void print(){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
printf("%d ",ans[i][j]);
puts("");
}
} void scz(){
int han=,li=;
for(int i=;i<=n;i++) han+=an[][i],li+=an[i][];
if(han>hang||li>lie) return;
hang=han,lie=li;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
ans[i][j]=an[i][j];
} void dfs(int x,int y){
if(y==n+){
int sum=;
if(x==&&hang!=) {
for(int i=;i<=n;i++) sum+=an[][i];
if(sum>hang) return;
hang=sum;
}
x++,y=;
}
if(x==n+&&y==) {
scz();
print();
exit();
return;
}
if(y==&&x==n&&lie!=){
int sum=;
for(int i=;i<=n;i++) sum+=an[i][];
if(sum>lie) return;
lie=sum;
}
if(x==||y==){
for(int i=;i<=n*n;i++){
if(vi[i]) continue;
int z=an[x][y-],s=an[x-][y];
if(z&&!p[z][i]) continue;
if(s&&!p[s][i]) continue;
an[x][y]=i;vi[i]=;
dfs(x,y+);
an[x][y]=;vi[i]=;
}
}
else {
for(int i=n*n;i>=;i--){
if(vi[i]) continue;
int z=an[x][y-],s=an[x-][y];
if(z&&!p[z][i]) continue;
if(s&&!p[s][i]) continue;
an[x][y]=i;vi[i]=;
dfs(x,y+);
an[x][y]=;vi[i]=;
}
}
} bool tp(int x){
for(int i=;i<=sqrt(x);i++)
if(x%i==) return false;
return true;
} void yu(){
for(int i=;i<=n*n;i++){
for(int j=;j<=n*n;j++){
if(tp(i+j)) p[i][j]=;
  }
}
} int main()
{
scanf("%d",&n);
if(n==) printf("NO\n");
else{
hang=lie=;
yu();
vi[]=;
an[][]=;
dfs(,);
if(hang==) cout<<"NO\n";
else print();
}
return ;
}

洛谷——P1549 棋盘问题(2)的更多相关文章

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

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

  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. Python获取CPU、内存使用率以及网络使用状态代码

    Python获取CPU.内存使用率以及网络使用状态代码_python_脚本之家 http://www.jb51.net/article/134714.htm

  2. mysqld 与 python 邮件监控脚本 内存消耗对比

    top - 21:38:40 up 1 day, 10:38, 5 users, load average: 0.00, 0.01, 0.17Tasks: 88 total, 1 running, 8 ...

  3. 扩展欧几里得模板&逆元求法

    拓展欧几里得: 当 gcd ( a , b )= d 时,求绝对值和最小的 x , y 使得 x * a + y * b = d : d = gcd ( a , b ) = gcd ( b , a m ...

  4. Android 录音和摄像头权限适配【转】

    本文转载自:http://blog.csdn.net/self_study/article/details/52965045 最近在研究权限适配的相关内容,整理以前的权限博客如下:  android ...

  5. 4-3 买家类目-service

    DAO:ProductCategory.Service可以简化一些,叫CategoryService. package com.imooc.sell.service; import com.imooc ...

  6. [Swift通天遁地]一、超级工具-(13)使用PKHUD制作各种动态提示窗口

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. [Usaco2005 oct]Flying Right 飞行航班

    Description 为了表示不能输给人类,农场的奶牛们决定成立一家航空公司.她们计划每天早晨,从密歇根湖湖岸的最北端飞向最南端,晚上从最南端飞往最北端.在旅途中,航空公司可以安排飞机停在某些机场. ...

  8. J - Ananagrams(map+vector)

    Description Most crossword puzzle fans are used to anagrams--groups of words with the same letters i ...

  9. jQuery学习笔记(1)-初探

    一.jQuery是什么 1.jQuery是一套JavaScript脚本库,而不是框架:就好比"System是程序集"是类库,而"ASP.NET MVC"是框架: ...

  10. MVC之参数验证(三)

    在实际开发中,项目经理会一直强调一句话,永远不要相信客户端的数据(前端可以不用验证,但是后端必须验证).大家同意这样的说法吧..新端验证毋庸质疑JS验证,提高用户体验我们不得不添加一些与后端一致的验证 ...