2022秋人工智能实验报告
实验名称一:百事好合
实验要求:将 1, 2, 3, 4, 5, 6, 7, 8, 9 这九个数字,不改变顺序,用加减号连起来(允许减
号出现在 1 的前面),使其结果等于 100。请编程输出所有可能的情况,数字和符号之间不
要有空格,如 1+23-4+56+7+8+9=100。总共有 12 种不同的组合。
一、主要思路:
1、模型:
通过对题目进行分析,我们可以在1~9这九个数字之间画上一个空格,填入相应的符号,让这些数字之间的关系变成相加、相减或者连接成为新的高位数,通过判断所填的空的内容是否符合要求来解决问题。这一类的问题都可以通过“填空”进行解决,通过穷举法筛选需要的结果 。
2、算法:穷举法、双重循环、十进制转换三进制
因为考虑到数字1的前面也涉及到了符号的问题,所以首先考虑的是在每个数字前面插上一个空,这样一来九个数字前面就有九个对应的空格需要填充,这样就会涉及到3的9次方种结果,但是在这里面也会包含1前面的连接符,但是1前面是不涉及到连接问题的,所以将1做一个单独的处理,先默认为+1,这样一来,我们所要考虑的就只有8个空格,也就是3的8次方种结果。然后把+1替换成为-1的情况,输出符合的结果。这样一来就大大减少了计算量。
首先设定一个外层循环,这个外层循环用来遍历3的8次方种结果,然后设定一个内层循环用来遍历8个空格,从9前面的空格往后推。这里涉及到怎样把外层循环的i和内层联系起来,保证每个空格的符号一一对应上。每个空格有三种填法:0、1、2代表+、-、连接,也就是三进制的数,将外层的i值转换成三进制的数就可以保证每种结果都被考虑到,然后在这三种情况下对数字进行操作,进行存储。最后判断结果是否符合100,如果是就输出表达式。
对于特殊情况1 ,先用+1进行遍历,然后再进行一次遍历,找到102的结果把+1替换成-1的结果输出。
二、程序实现及优化:
1、程序实现所用头文件解释:
#include :数据的输入输出
#define NUM 6561 :定义常量,表示填8个空的总共种类
#include <memory.h>:清零函数的使用
2、算法伪代码:
for i=0 to NUM do //总共有6561种可能
{
memset(Number, 0, sizeof(int)*9); //初始化函数清零
flag:= i;
for second=9 to 1 do //有8处符号需要判断1_2_3_4… 从后往前推
{
symbol: = flag