随笔 - 数独游戏

无聊的时候随手写了一个结数独的程序= =,记录一下

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
using namespace std;

#define Int __int64
#define INF 0x3f3f3f3f

int maze[15][15];
bool row[15][15];
bool column[15][15];
bool cube[15][15][15];
bool judge;
int ans, res;

bool JudgeRow(int x, int y, int n) {
  if (row[x][n]) return false;
  else return true;
}

bool JudgeColumn(int x, int y, int n) {
  if (column[y][n]) return false;
  else return true;
}

bool JudgeCube(int x, int y, int n) {
  int i = x / 3;
  int j = y / 3;
  if (cube[i][j][n]) return false;
  else return true;
}

void Solve(int x, int y, int ans) {
  if (judge) return ;
  if (ans == res) {
    for (int i = 0; i < 9; i++) {
      for (int j = 0; j < 9; j++) {
        cout << maze[i][j] << " ";
      }
      cout << endl;
    }
    judge = true;
    return ;
  }
  if (maze[x][y] > 0) {
    int xx = x;
    int yy = y + 1;
    if (yy >= 9) {
    yy = 0;
    xx += 1;
  }
  Solve(xx, yy, ans);
  } else {
    for (int i = 1; i <= 9; i++) {
      if (JudgeRow(x, y, i) && JudgeCube(x, y, i) && JudgeColumn(x, y, i)) {
        maze[x][y] = i;
        row[x][i] = true;
        column[y][i] = true;
        cube[x / 3][y / 3][i] = true;

        Solve(x, y, ans + 1);

        maze[x][y] = 0;
        row[x][i] = false;
        column[y][i] = false;
        cube[x / 3][y / 3][i] = false;
      }
    }
  }
}

int main() {
  //freopen("input.txt", "r", stdin);
  memset(maze, 0, sizeof(maze));
  memset(row, false, sizeof(row));
  memset(column, false, sizeof(column));
  memset(cube, false, sizeof(cube));
  //初始化题目信息
  res = ans = 0;
  for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
      cin >> maze[i][j];
      if (maze[i][j] > 0) {
        res++;
        row[i][maze[i][j]] = true;
        column[j][maze[i][j]] = true;
        cube[i / 3][j / 3][maze[i][j]] = true;
      }
    }
  }
  res = 81 - res;
  //开始填空
  judge = false;
  Solve(0, 0, 0);
  if (!judge) cout << "No Answer!" << endl;
}

时间: 2024-08-06 17:21:49

随笔 - 数独游戏的相关文章

数独游戏求解程序

最近玩数独游戏,每行.每列.以及9宫格都包含1-9个数组.觉得这东西很适合用程序来求解.于是我就仿照中国象棋的暴力搜索算法(可参考我之前写的文章极大极小搜索算法),写了一个程序求解数独,直接贴代码了 /** * 模仿象棋程序的搜索算法,写一个求解数独的程序 * @author royhoo * */ public class ShuDu { private int[][] board; // 数独矩阵 private int zeroNum; // 缺失的数字个数 private int fil

数独游戏的设计与实现

前景:数独游戏,是一种数学智力拼图游戏,是“独立的数字游戏”的简称,源自18世纪末的瑞士,后在美国发展,在日本得以发扬光大. 数独游戏可以训练玩家的逻辑推理能力,不少教育者皆认为数独是锻炼脑筋的好方法. 然而如何制作出这个游戏?首先要了解它的规则: 1.游戏会从一个部分带有数字的九宫格开始. 在9×9的大九宫格(即3格宽×3格高)方阵里,每一格又细分为一个小九宫格. 2.游戏开始,已给定若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 3.填数字时必须满足以下条件:在空

5乘5的数独游戏

用了三个周的业余时间,日思夜想的牵挂才把5乘5的数独游戏填满了二十五个宫格. 在这前一篇<数独游戏新篇章>里面,通过对第一个宫格使用位移变换来得到后面的二十四个宫格,总觉得没有什么意思.现在可以通过回溯的办法填满整个二十五个宫格,又觉得这样的结果好像120个点的连通图里面的哈密顿回路的条数那样多得不可思议,所以就想在一个已经填入了一部分数字的情况下,再把其余的格子填满,因为已经有了可以解决3乘3标准数独的基础(前一篇那一个是芬兰数学家给出的世界最难标准数独,编写的程序运行十小时就能得到结果,就

android数独游戏

最近没事干,照着视频教程写了一个数独游戏,很粗糙还有很多要修改的地方.下面就来说说这个游戏吧 1.自定义一个View控件,用来在屏幕上显示一个9*9的格子,其实就是横着画8条线,竖着画8跳线,然后将其中的几条线加粗一下.这样就形成了9*9的格子了 2.用一个字符串初始化游戏界面上的数字 1 String str_int = "360000000004230800000004200"+ 2 "070460003820000014500013020"+ 3 "

C语言学习 数独游戏

摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 Win64) 参考: 互动百科 数独 章节: 正文: 原来也用C#和Go语言写过,主要思路是暴力撞大运破解.思路什么的在程序了都注释了,不多说了.可能是没用什么先进的算法,感觉C解题速度和C#差不多(除了C#第一次运行之外),基本上出来一个数独表都不用1秒. 附完整程序: 1 /*********************

数独游戏算法

# #author:wuhao # #解数独游戏 # #想法:从(0,0)开始往下遍历,(当然从什么位置开始遍历是无所谓的,只是代码写法可能要有点变化,我是从(0,0)开始往下逐层遍历),首先判断其是否需要填值check(a,i,j),如果需要填值就填上其可能的值保存在FillData(a,i,j),返回的是一个list存放的是其可能的值,最后进行遍历查找正确的结果 check函数: def check(a,i,j): if a[i][j]==0: return True return Fals

数独游戏代码

//数独游戏c++ class CSudoku { int map[9][9]; int blanks; int smod; int solves; int check(int,int,int*); void dfs(); public: enum{ANY=0,ALL=1}; CSudoku(int); CSudoku::CSudoku(int *data); void SudokuGenerator(int); //随机生成数独,n越大越难 void SudokuGenerator(int *

【QT学习】数独游戏

前几天刷leetcode刷到一题,讲sudokuSolver,写完感觉很有意思,遂想做一个数独游戏,百度了一下如何自动生成题库,参考某位大神安卓下的实现思路,自己做了一套文字版的数独游戏,后来想乘机会学一下QT于是完成了图形界面的数独.先mark一下之后从数独解题,数独出题,QT图形界面来讲讲自己的心得体会. 界面写完是这样的.也算有点小成就感了. 游戏链接+QT运行动态库 http://pan.baidu.com/s/1kTu5alh

安卓开发_数独游戏基础(二)

老师视频教程结束了,但是游戏并未完成.下面便开始自己动手完善部分功能 需要完善的功能: 1.设置给定的数独数据数字不可改变 2.设置给定的数独数据数字和玩家填入的数字颜色不同,方便区分 3.判断填写后的数独是否符合数独游戏规则 解决方法: 1.设置给定的数独数据数字不可改变 我的思路,因为给定的数据数字是给定的,而数据是放在一个字符串里的,如下:0代表需要玩家输入的,非0则是给定的 1 private final String str = "061030020050008107000007034