博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
靶形数独
阅读量:5908 次
发布时间:2019-06-19

本文共 3022 字,大约阅读时间需要 10 分钟。

90 分#include
#include
using namespace std;int flag[99][99];int s=0;int a[9][9]={ {6,6,6,6, 6,6,6,6,6},{6,7,7,7, 7,7,7,7,6},{6,7,8,8, 8,8,8,7,6},{6,7,8,9, 9,9,8,7,6},{6,7,8,9,10,9,8,7,6},{6,7,8,9, 9,9,8,7,6},{6,7,8,8, 8,8,8,7,6},{6,7,7,7, 7,7,7,7,6},{6,6,6,6, 6,6,6,6,6}};int c[9][9]={ 1,1,1,2,2,2,3,3,3, 1,1,1,2,2,2,3,3,3, 1,1,1,2,2,2,3,3,3, 4,4,4,5,5,5,6,6,6, 4,4,4,5,5,5,6,6,6, 4,4,4,5,5,5,6,6,6, 7,7,7,8,8,8,9,9,9, 7,7,7,8,8,8,9,9,9, 7,7,7,8,8,8,9,9,9,};int b[99][99];int f[10][10];int fh[10][10];int fs[10][10];int max1=-1;int f4;void dfs(int x,int y,int ans){ if(f4==1) return; if(x==0&&y==9) { f4=1; for(int i=0;i<=8;i++) {
for(int j=0;j<=8;j++) printf("%d ",b[i][j]); printf("\n"); } //max1=max(ans,max1); // return; } if(!b[x][y]) { for(int i=1;i<=9;i++) if(fh[x][i]==0&&fs[y][i]==0&&f[c[x][y]][i]==0) {
b[x][y]=i; fh[x][i]=1; fs[y][i]=1; f[c[x][y]][i]=1; if(x<8) {
dfs(x+1,y,ans+a[x][y]*i); } else {
dfs(0,y+1,ans+a[x][y]*i); } fh[x][i]=0; fs[y][i]=0; f[c[x][y]][i]=0; b[x][y]=0; } } else {
if(x<8) dfs(x+1,y,ans); else dfs(0,y+1,ans); }}int main(){ for(int i=0;i<=8;i++) for(int j=0;j<=8;j++) {
scanf("%d",&b[i][j]); if(b[i][j]) {
fh[i][b[i][j]]=1; fs[j][b[i][j]]=1; f[c[i][j]][b[i][j]]=1; s+=a[i][j]*b[i][j]; } } dfs(0,0,s); printf("%d",max1); return 0;}

可以解数独游戏了!!!

这个题一开始我是蛇形遍历,有点麻烦
。。。
后来看了xy的便改了

sxb大神思路#include
#include
#include
using namespace std;int s=0;int n=0;int can[10][10];//记录能填多少数 int a[9][9]={ {6,6,6,6, 6,6,6,6,6},{6,7,7,7, 7,7,7,7,6},{6,7,8,8, 8,8,8,7,6},{6,7,8,9, 9,9,8,7,6},{6,7,8,9,10,9,8,7,6},{6,7,8,9, 9,9,8,7,6},{6,7,8,8, 8,8,8,7,6},{6,7,7,7, 7,7,7,7,6},{6,6,6,6, 6,6,6,6,6}};//打表 int c[9][9]={ 1,1,1,2,2,2,3,3,3, 1,1,1,2,2,2,3,3,3, 1,1,1,2,2,2,3,3,3, 4,4,4,5,5,5,6,6,6, 4,4,4,5,5,5,6,6,6, 4,4,4,5,5,5,6,6,6, 7,7,7,8,8,8,9,9,9, 7,7,7,8,8,8,9,9,9, 7,7,7,8,8,8,9,9,9,};int b[99][99];int f[10][10];int fh[10][10];int fs[10][10];int max1=-1;int f1(int x,int y,int k){ if(!fh[x][k]&&!fs[y][k]&&!f[c[x][y]][k]) return 1; return 0;}void dfs(int X,int ans){ if(X>(81-n))//已填完 {
max1=max(ans,max1); return; } memset(can,0,sizeof(can)); int x,y,mmin=99999999; for(int i=0;i<9;i++) for(int j=0;j<9;j++) if(!b[i][j]) {
for(int k=1;k<=9;k++) if ( f1(i,j,k) ) can[i][j]++; if(can[i][j]

这个思路666,直接就a了otc

转载于:https://www.cnblogs.com/wspl98765/p/6819899.html

你可能感兴趣的文章
Oracle 字符集的查看和修改【上】
查看>>
tomcat注册windows服务
查看>>
使用qq邮箱的smpt服务发送邮件一定要记得用ssl
查看>>
20个非常有用的Java代码片段
查看>>
网站优化和竞价有什么区别
查看>>
MySQL开源热备工具XtraBackup的原理与程序说明
查看>>
mongoDB(1):windows下安装mongoDB(解压缩版)
查看>>
Ubuntu解决RTNETLINK answers: File exists
查看>>
ES6数组去重的最佳实践:Set结合Array.from() | 拓展运算符结合 Set
查看>>
深入屏幕像素概念
查看>>
awk命令的几个选项注释
查看>>
Windows更改临时文件夹
查看>>
iRedMail调整附件大小 & Postfix的bcc(自动转发/邮件备份/监控/归档) 在同一个服务器是有压力...
查看>>
唯识相链由来
查看>>
linux系统的负载与CPU、内存、硬盘、用户数监控shell脚本
查看>>
c语言简单版坦克大战(AllenEnemyTrank文件)
查看>>
Python中被双下划线包围的魔法方法
查看>>
JAVA核心编程教学
查看>>
Oracle:数据类型对应表
查看>>
第六届蓝桥杯java b组第四题
查看>>