在3x3的方格中填入数字1~N(N>0)中的某9个数字,每个方格填1个整数,使相邻的两个方格中的整数之和为质数。求满足以上要求的各种数字填法。
【分析】
利用试探法找到问题的解,即从第一一个方格开始, 为当前方格寻找一个合理的整数填入,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如果不能为当前方格找到一个合理的可填整数,就要回退到前一方格,调整前一方格的填入数。当第9个方格也填入合理的整数后,就找到了一个解,将该解输出,并调整第9个填入的整数,继续寻找下一个解。为了检查当前方格填入整数的合理性,引入二维数组checkMatrix 存放需要合理性检查的相邻方格的序号。

为了找到一个满足要求的9个数的填法,按照某种顺序(如从小到大)每次在当前位置填入一个整数,然后检查当前填入的整数是否能够满足要求。在满足要求的情况下,继续用同样的方法为下一方格填入整数。 如果最近填入的整数不能满足要求,就改变填入的整数。 如果对当前方格试尽所有可能的整数,都不能满足要求,就得回退到前一方格 (回溯),并调整该方格填入的整数。如此重复扩展、检查、调整,直到找到一个满足问题要求的解, 将解输出。

code:

#include<stdio.h>
#define N 12
int b[N + 1];
int a[10];/*存放方格填入的整数*/
int total = 0;/*共有多少种填法*/
int checkmatrix[][3] = { { -1 },{ 0,-1 },{ 1,-1 },
{ 0,-1 },{ 1,3,-1 },{ 2,4,-1 },
{ 3,-1 },{ 4,6,-1 },{ 5,7,-1 } };
void write(int a[])
/*输出方格中的数字*/
{int i, j;for (i = 0; i < 3; i++){for (j = 0; j < 3; j++)printf("%3d", a[3 * i + j]);printf("\n");}
}
int isprime(int m)
/*判断m是否是质数*/
{int i;int primes[] = { 2,3,5,7,11,17,19,23,29,-1 };if (m == 1 || m % 2 == 0)return 0;for (i = 0; primes[i]>0; i++)if (m == primes[i])return 1;for (i = 3; i*i <= m;){if (m%i == 0)return 0;i += 2;}return 1;
}
int selectnum(int start)
/*从start开始选择没有使用过的数字*/
{int j;for (j = start; j <= N; j++)if (b[j])return j;return 0;
}
int check(int pos)
/*检查填入的pos位置是否合理*/
{int i, j;if (pos < 0)return 0;/*判断相邻的两个数是否是质数*/for (i = 0; (j = checkmatrix[pos][i]) >= 0; i++)if (!isprime(a[pos] + a[j]))return 0;return 1;
}
int extend(int pos)
/*为下一个方格找一个还没有使用过的数字*/
{a[++pos] = selectnum(1);b[a[pos]] = 0;return pos;
}
int change(int pos)
/*调整填入的数,为当前方格寻找下一个还没有用到的数*/
{int j;/*如果所有数都被使用,则回溯*/while (pos >= 0 && (j = selectnum(a[pos] + 1)) == 0)b[a[pos--]] = 1;if (pos < 0)return -1;b[a[pos]] = 1;a[pos] = j;b[j] = 0;return pos;
}
void find()
/*查找*/
{int ok = 0, pos = 0;a[pos] = 1;b[a[pos]] = 0;do{if (ok)if (pos == 8){total++;printf("第%d种填法\n", total);write(a);pos = change(pos);/*调整*/}elsepos = extend(pos);/*扩展*/elsepos = change(pos);/*调整*/ok = check(pos);/*检查*/} while (pos >= 0);
}
void main()
{int i;for (i = 1; i <= N; i++)b[i] = 1;find();printf("共有%d种填法\n", total);getchar();
}

结果:

回溯算法2——填字游戏相关推荐

  1. python36块砖36人搬算法_Python填字游戏算法题

    今天在OpenHatch上找到一个涉及到很多Python知识点的问题,这个问题写着适于中级水平的Python程序员自测,需求是编写一个带评分功能的英文填字图版游戏,我尝试用2.7版本的Python对其 ...

  2. opencv3+python3.5成语填字游戏(三)成语填字游戏解密算法

    本篇介绍填字游戏解密算法,本算法尚且存在一些问题,并不适合所有成语填字游戏. 源代码:https://github.com/mayue801/crossword-puzzle--idiom 1.找到横 ...

  3. 求解3*3方格填字游戏问题(DFS + 质数)

    继续来水一道题... 一. 实验目的 加深对求解一个3 * 3方格两两相邻为质数求解算法的理解; 通过本次试验掌握将算法转换为上机操作; 加深对深度优先搜索思想的理解,理解回溯原理即实现过程,并利用其 ...

  4. AI玩填字游戏,赢得全国锦标赛冠军!官方:不是人,没有奖金和名次

    杨净 发自 家里 量子位 报道 | 公众号 QbitAI 上周,一年一度的美国填字游戏锦标赛(ACPT)落下了帷幕,共有1300多名人员线上参与. 最终官方认定,一位Tyler Hinman的玩家夺得 ...

  5. LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的矩阵 board ,它代表一个填字游戏 当前 的状态. 填字游戏格子中包含小写英文字母(已填入的单词),表示 空格 的 ' ' 和 ...

  6. 应用JavaFX实现的填字游戏

    题目来自我们老师这次布置的一个大作业,说实话,刚开始觉得难度超纲了,毕竟javaFX我们才刚开头,基本上没讲啥,全靠自学-自己看书敲代码,学习书上案例,然后书上没有的就百度,边学边做,现学现卖,题目基 ...

  7. python编写古诗_用Python实现古诗词填字游戏(一)

    利用古诗词做填字游戏是一项很有趣的活动,通常的填字游戏都是由几横几竖构成,如下图: 显然,横竖交叉的位置就是两句诗共有的字.那么,问题来了,如何从众多诗文中找到有共同字的句子呢? 这里Mr. PosP ...

  8. [2022.1.13]UPC-2021级新生个人训练赛第22场-9782 Problem G 填字游戏

    问题 G: 填字游戏 时间限制: 1.000 Sec 内存限制: 128 M 题目描述 六一儿童节就要到了,晨晨的学校进行游园活动,其中一个游戏为填字游戏,规则为:有一个R行C列的棋盘(2≤R,C≤2 ...

  9. 最强大脑----“汉字女英雄”填字游戏研究

    最强大脑----"汉字女英雄"填字游戏研究 一.引子 江苏卫视的<最强大脑>2014年1月17日星期五第三期第一个节目,是"汉字女英雄"胡小玲所表演 ...

最新文章

  1. P5568 [SDOI2008]校门外的区间(离散数学应用+线段树+开闭区间处理)(校门三部曲)难度⭐⭐⭐⭐
  2. 使用Hibernate操作数据库
  3. 2022年初,给5年内还想做产品经理的提个醒!
  4. 解析markdown_markdown-it 原理浅析
  5. linux集群的启动和停止,linux平台 spark standalone集群 使用 start-all,stop-all 管理集群的启动和退出...
  6. flow使用_使用Microsoft Flow进行文本分析
  7. Win7+keras+tensorflow使用YOLO-v3训练自己的数据集
  8. oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)
  9. Centos下安装Scrapy
  10. Kali linux 渗透测试(五)——渗透WPS攻击
  11. 阿里有centos7 安装MongoDB及win7下MongoChef的安装
  12. steam服务器102修复,steam社区打不开错误代码102解决方法
  13. 统计学常用概念:T检验、F检验、卡方检验、P值、自由度
  14. OpenGL ES 之 2D 纹理介绍和使用
  15. gentoo mysql_gentoo
  16. 国庆节,企查查我来啦~
  17. 后端实践:Nginx日志配置(超详细)
  18. c语言中逆序乘积,逆序乘积式(示例代码)
  19. 安卓listview下拉刷新_iPhone上被吹爆的良心App,安卓手机终于能用上了
  20. 英超前瞻乐.fun|体育 中秋利物浦主场对战狼队 历史交战能否延续全胜

热门文章

  1. docker中sentinel无法监控
  2. python3 清除过滤emoji表情
  3. 水星5口交换机划分Vlan
  4. 档案装订需要使用计算机吗,会计档案的装订包括什么
  5. MySQL深入学习(十八):MySQL8其它新特性
  6. win10添加开机自启软件
  7. RTL8762DK 环境搭建(一)
  8. RS232的硬件流控
  9. 推荐一个文字转语音好网站
  10. cout输出格式控制