用C++实现俄罗斯方块
来源:互联网 发布:知夏向天床戏 编辑:程序博客网 时间:2024/05/21 17:30
#include<iostream>
using namespace std;
/* 构造完成标志 */
bool sign = false;
/* 创建数独矩阵 */
int num[9][9];
/* 函数声明 */
void Input();
void Output();
bool Check(int n, int key);
int DFS(int n);
/* 主函数 */
int main()
{
cout << "此程序为解数独的代码" << endl;
cout << "请输入一个9*9的数独矩阵,空位以0表示: " << endl;
Input();
DFS(0);
Output();
system("pause");
}
/* 读入数独矩阵 */
void Input()
{
char temp[9][9];
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cin >> temp[i][j];
num[i][j] = temp[i][j] - '0';
}
}
}
/* 输出数独矩阵 */
void Output()
{
cout << endl;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << num[i][j] << " ";
if (j % 3 == 2)
{
cout << " ";
}
}
cout << endl;
if (i % 3 == 2)
{
cout << endl;
}
}
}
/* 判断key填入n时是否满足条件 */
bool Check(int n, int key)
{
/* 判断n所在横列是否合法 */
for (int i = 0; i < 9; i++)
{
/* j为n竖坐标 */
int j = n / 9;
if (num[j][i] == key) return false;
}
/* 判断n所在竖列是否合法 */
for (int i = 0; i < 9; i++)
{
/* j为n横坐标 */
int j = n % 9;
if (num[i][j] == key) return false;
}
/* x为n所在的小九宫格左顶点竖坐标 */
int x = n / 9 / 3 * 3;
/* y为n所在的小九宫格左顶点横坐标 */
int y = n % 9 / 3 * 3;
/* 判断n所在的小九宫格是否合法 */
for (int i = x; i < x + 3; i++)
{
for (int j = y; j < y + 3; j++)
{
if (num[i][j] == key) return false;
}
}
/* 全部合法,返回正确 */
return true;
}
/* 深搜构造数独 */
int DFS(int n)
{
/* 所有的都符合,退出递归 */
if (n > 80)
{
sign = true;
return 0;
}
/* 当前位不为空时跳过 */
if (num[n / 9][n % 9] != 0)
{
DFS(n + 1);
}
else
{
/* 否则对当前位进行枚举测试 */
for (int i = 1; i <= 9; i++)
{
/* 满足条件时填入数字 */
if (Check(n, i) == true)
{
num[n / 9][n % 9] = i;
/* 继续搜索 */
DFS(n + 1);
/* 返回时如果构造成功,则直接退出 */
if (sign == true) return 0;
/* 如果构造不成功,还原当前位 */
num[n / 9][n % 9] = 0;
}
}
}
}
using namespace std;
/* 构造完成标志 */
bool sign = false;
/* 创建数独矩阵 */
int num[9][9];
/* 函数声明 */
void Input();
void Output();
bool Check(int n, int key);
int DFS(int n);
/* 主函数 */
int main()
{
cout << "此程序为解数独的代码" << endl;
cout << "请输入一个9*9的数独矩阵,空位以0表示: " << endl;
Input();
DFS(0);
Output();
system("pause");
}
/* 读入数独矩阵 */
void Input()
{
char temp[9][9];
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cin >> temp[i][j];
num[i][j] = temp[i][j] - '0';
}
}
}
/* 输出数独矩阵 */
void Output()
{
cout << endl;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << num[i][j] << " ";
if (j % 3 == 2)
{
cout << " ";
}
}
cout << endl;
if (i % 3 == 2)
{
cout << endl;
}
}
}
/* 判断key填入n时是否满足条件 */
bool Check(int n, int key)
{
/* 判断n所在横列是否合法 */
for (int i = 0; i < 9; i++)
{
/* j为n竖坐标 */
int j = n / 9;
if (num[j][i] == key) return false;
}
/* 判断n所在竖列是否合法 */
for (int i = 0; i < 9; i++)
{
/* j为n横坐标 */
int j = n % 9;
if (num[i][j] == key) return false;
}
/* x为n所在的小九宫格左顶点竖坐标 */
int x = n / 9 / 3 * 3;
/* y为n所在的小九宫格左顶点横坐标 */
int y = n % 9 / 3 * 3;
/* 判断n所在的小九宫格是否合法 */
for (int i = x; i < x + 3; i++)
{
for (int j = y; j < y + 3; j++)
{
if (num[i][j] == key) return false;
}
}
/* 全部合法,返回正确 */
return true;
}
/* 深搜构造数独 */
int DFS(int n)
{
/* 所有的都符合,退出递归 */
if (n > 80)
{
sign = true;
return 0;
}
/* 当前位不为空时跳过 */
if (num[n / 9][n % 9] != 0)
{
DFS(n + 1);
}
else
{
/* 否则对当前位进行枚举测试 */
for (int i = 1; i <= 9; i++)
{
/* 满足条件时填入数字 */
if (Check(n, i) == true)
{
num[n / 9][n % 9] = i;
/* 继续搜索 */
DFS(n + 1);
/* 返回时如果构造成功,则直接退出 */
if (sign == true) return 0;
/* 如果构造不成功,还原当前位 */
num[n / 9][n % 9] = 0;
}
}
}
}
阅读全文
0 0
- 用c实现俄罗斯方块游戏过程
- C实现的俄罗斯方块
- 【C语言】实现俄罗斯方块
- C语言实现的俄罗斯方块
- 俄罗斯方块(C语言实现)
- 用C++实现俄罗斯方块
- 基于VC 6.0 用C语言实现的俄罗斯方块
- 用c语言编写俄罗斯方块
- 用C语言写俄罗斯方块
- 关于C语言俄罗斯方块的基本实现!
- c语言实现扫雷和俄罗斯方块
- 52行c代码实现俄罗斯方块
- VC++ 6.0 C语言实现俄罗斯方块教程
- 俄罗斯方块的c语言基本实现
- VC++ 6.0 C语言实现俄罗斯方块教程
- C语言之俄罗斯方块游戏实现
- 俄罗斯方块(C++)
- 【Python】用Python实现一个俄罗斯方块游戏
- C# 打开pdf、doc。xls.文件
- Dubbo 简单RPC调用示例
- SQL语句
- ros 安装 qt creator plugin
- 教育直播开发:直播+教育新模式的大活力 在全民直播时代,大部分东西都可以和直播联系起来,比如商城直播系统、在线抓娃娃系统、教育直播系统等,这些分别是电商、线下娃娃机、在线教育与直播相结合,今天要大家说
- 用C++实现俄罗斯方块
- Phyton安装MySQL驱动
- 201712月如何买到阿里云免费SSL证书(0元SSL证书)
- MySQL 5.6 not in 和表关联性能测试对比
- java的enum作用
- 变长参数模版函数初探
- Android gralde 更换不同资源
- windows搭建laravel开发环境
- 博客搬家