IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法趣题-Q13 -> 正文阅读

[数据结构与算法]算法趣题-Q13

一、问题描述

?

二、问题分析

? ? ? ? 一种方法是直接暴力列举所有的排列数,再进行计算判定,那么需要进行10!次判断,效率太低,如代码实现中Python实现,但由于Python语言的友好,导致其代码数量少;

????????另一种方法是DFS深度优先遍历,并结合一些的剪枝操作,能够大量排除无效的排列,加快了运行速度,在我的C/C++实现中就是如此,当然也可以使用递归的方式避免重复编码(这里我将代码展开方便理清逻辑)。

三、代码实现

1.C/C++实现

#include <iostream>

using namespace std;

bool flags[10] = { false };

int carry = 0;
int myCount = 0;

// READ + WRITE + TALK = SKILL
// R, W, T, S 不为 0
// 从低位向高位DFS并进行剪枝
void DFS()
{
	for (int d = 0; d < 10; d++)
	{
		flags[d] = true;
		for (int e = 0; e < 10; e++)
		{
			if (flags[e])
				continue;
			flags[e] = true;
			for (int k = 0; k < 10; k++)
			{
				if (flags[k])
					continue;
				int sum0 = d + e + k;
				int carry0 = sum0 / 10;
				int l = sum0 % 10;
				if (flags[l])
					continue;
				flags[k] = flags[l] = true;
				for (int a = 0; a < 10; a++)
				{
					if (flags[a])
						continue;
					flags[a] = true;
					for (int t = 1; t < 10; t++)
					{
						if (flags[t])
							continue;
						int sum1 = a + t + l + carry0;
						int carry1 = sum1 / 10;
						if (sum1 % 10 != l)
							continue;
						flags[t] = true;
						for (int i = 0; i < 10; i++)
						{
							if (flags[i])
								continue;
							int sum2 = e + i + a + carry1;
							int carry2 = sum2 / 10;
							if (sum2 % 10 != i)
								continue;
							flags[i] = true;
							for (int r = 1; r < 10; r++)
							{
								if (flags[r])
									continue;
								int sum3 = r + r + t + carry2;
								int carry3 = sum3 / 10;
								if (sum3 % 10 != k)
									continue;
								flags[r] = true;
								if (flags[0])  // w, s 不能为0
								{
									int num[2];  // w, s
									int index = 0;
									for (int temp = 0; temp < 10 && index < 2; temp++)
										if (!flags[temp])
											num[index++] = temp;
									if (num[0] + carry3 == num[1] 
                                            || num[1] + carry3 == num[0])
										myCount++;
								}
								flags[r] = false;
							}
							flags[i] = false;
						}
						flags[t] = false;
					}
					flags[a] = false;
				}
				flags[k] = flags[l] = false;
			}
			flags[e] = false;
		}
		flags[d] = false;
	}
}

int main()
{
	DFS();
	cout << myCount << endl;
	return 0;
}

2.Python实现

# coding=utf-8

import itertools

if __name__ == '__main__':
    nums = '0123456789'
    count = 0
    chars = ['R', 'E', 'A', 'D', 'W', 'I', 'T', 'L', 'K', 'S']
    for item in itertools.permutations(nums):
        if item[0] == '0' or item[4] == '0' or item[6] == '0' or item[9] == '0':
            continue
        d = {chars[i]: item[i] for i in range(10)}
        if eval("{R}{E}{A}{D}+{W}{R}{I}{T}{E}+{T}{A}{L}{K}".format(**d)) == eval("{S}{K}{I}{L}{L}".format(**d)):
            count += 1
    print(count)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 12:00:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:58:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码