当前位置: 首页 > news >正文

洛谷P1219、P1784、P11229三题的题解



因为八个皇后位置之间相互制约,所以肯定得记录每个皇后的位置。
我们可以枚举每一个格子的位置,再看它的列、对角线是否与其他皇后相等。(dfs传进的参数为行号,不会相重)

#include<bits/stdc++.h>usingnamespacestd;intn,a[15],cnt;boolc[15],d1[30],d2[30];boolcheck(intr,inti){return!c[i]&&!d1[r-i+n]&&!d2[r+i];}voiddfs(intr){if(r==n){cnt++;if(cnt<=3){for(inti=0;i<n;i++){cout<<a[i]+1<<" ";}cout<<endl;}return;}for(inti=0;i<n;i++){if(check(r,i)){//放a[r]=i;c[i]=d1[r-i+n]=d2[r+i]=true;dfs(r+1);//回溯a[r]=0;c[i]=d1[r-i+n]=d2[r+i]=false;}}}intmain(){cin>>n;dfs(0);cout<<cnt;return0;}



此题和上一题解法类似,但是做标记的方式需改变。
规则:每一行、每一列数字不能重复。但是这样下去范围依然比较大,怎么办呢?
我们知道,一个九宫格可以分成九个“三宫格”,而这个“三宫格”里面的数字是不能重复的,所以就诞生了一个数组box,对于第i行j列的数字有box[i/3][j/3][a[i][j]]为1。

using namespace std; int a[9][9]; bool row[9][10],col[9][10],box[3][3][10]; vector<pair<int,int>> b; bool check(int r,int c,int i) { return !row[r][i]&&!col[c][i]&&!box[r/3][c/3][i]; } void dfs(int idx) { if(idx==(int)b.size()) { for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { cout<<a[i][j]<<" "; } cout<<endl; } exit(0); } int r=b[idx].first; int c=b[idx].second; for(int i=1;i<=9;i++) { if(check(r,c,i)) { a[r][c]=i; row[r][i]=col[c][i]=box[r/3][c/3][i]=true; dfs(idx+1); row[r][i]=col[c][i]=box[r/3][c/3][i]=false; } } } int main() { for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { cin>>a[i][j]; if(a[i][j]!=0) { row[i][a[i][j]]=true; col[j][a[i][j]]=true; box[i/3][j/3][a[i][j]]=true; } else b.push_back({i,j}); } } dfs(0); return 0; }


首先我看见这题的第一想法是尽量的多去拼8,因为它需要的木棍数最多,直接7个if判断余数,最后输出一/两个数字加一堆8。
但是这不是最优解,细心推导我们还会发现如果退回去一个或两个8能创造更小的数(自己尝试时试3个就行了,越往后其他数字拼起的位数越多)。

接着照着这张图写一堆if就行了。

#include<bits/stdc++.h>usingnamespacestd;intt;intmain(){cin>>t;while(t--){intn;cin>>n;if(n%7==0){for(inti=1;i<=n/7;i++)cout<<8;cout<<endl;}elseif(n%7==1){if(n==1){cout<<-1<<endl;continue;}cout<<10;for(inti=1;i<=n/7-1;i++)cout<<8;cout<<endl;}elseif(n%7==2){cout<<1;for(inti=1;i<=n/7;i++)cout<<8;cout<<endl;}elseif(n%7==3){if(n==3){cout<<7<<endl;continue;}intx=n/7;if(x==1)cout<<22<<endl;else{x-=2;cout<<200;for(inti=1;i<=x;i++)cout<<8;cout<<endl;}}elseif(n%7==4){if(n==4){cout<<4<<endl;continue;}cout<<20;for(inti=1;i<n/7;i++)cout<<8;cout<<endl;}elseif(n%7==5){cout<<2;for(inti=1;i<=n/7;i++)cout<<8;cout<<endl;}elseif(n%7==6){cout<<6;if(n==6){cout<<endl;continue;}for(inti=1;i<=n/7;i++)cout<<8;cout<<endl;}}return0;}
http://www.jsqmd.com/news/1370245/

相关文章:

  • 任世豪《狂徒》正式开播,周炎上演边境绝境逆袭棋局
  • Vulhub靶场(Shiro-550反序列化 RCE(CVE-2016-4437))从入门到入土
  • AI置信度决策路由:构建可靠智能系统的动态调度中枢
  • 倒排索引初步认识
  • 突破复杂场景通信瓶颈:低功耗广域网(LPWAN)LoRa技术选型与工程实战
  • 2026年8月大连全封闭减肥训练营/大连运动训练营哪家管理严格_大连跃动乐健身训练营 - 品牌宣传支持者
  • NX/UG二次开发:PK的方式判断一个圆柱面是否是完整的
  • NumPy数组创建全攻略:从底层原理到七大核心方法实践
  • 大文件分片上传与断点续传:Spring Boot + MinIO 实战指南
  • AI 写的中文为什么都是同一张脸?AI领域知名博主卡兹克把根治方法开源了!
  • C++ vector动态数组:从核心原理到高效编程实战指南
  • AI Agent缓存架构革新:从黑盒循环到结构化可缓存工作流设计
  • Visual Studio 2019添加bits/stdc++.h万能头文件:两种配置方案详解
  • 【金仓数据库征文】AI Agent SQL 执行超时与资源保护——在线问数不能把数据库当成“无限工具”
  • Spring WebFlux网关Connection reset by peer故障排查与Reactor Netty连接池优化
  • Unity Timeline代码控制实战:动态绑定、资源管理与性能优化
  • 保研全流程拆解——从大二到大四,每个节点该做什么
  • Photoshop下载安装教程(2025最全图文版)PS下载、安装步骤、配置与常见问题一篇搞定
  • PHP.d目录配置管理与优化实践指南
  • 稀疏注意力与长上下文:AI模型从规模竞赛到实用化的关键技术突破
  • 央视视频链接怎么获取?不同平台获取方法详解
  • 2026南昌优秀的AI 提升系统公司解惑:云搜数智(南昌办事处) - 热点品牌推荐
  • 《信念的灯塔》:一首歌如何给低谷听众方向感
  • 比亚迪ATTO3三相逆变器深度拆解:从FOC算法到SVPWM硬件实现
  • Visual Studio 2019企业版离线安装包制作与部署全攻略
  • 5分钟免费iOS激活锁绕过指南:Applera1n解锁iPhone 6s-X完整方案
  • Triton语言cos函数实现与GPU优化实践
  • 从OpenGL到Unity:深入理解渲染管线与Shader编写实战
  • 2026平航杯内存取证(StarMem)
  • Python音频剪辑工具HzChopGUI:本地化GUI实现与批量处理实践