NOIP1998 进制位题解

这篇博客介绍了NOIP1998年的一道关于进制位的题目,博主通过DFS算法进行求解。文章详细讲解了在编程过程中遇到的四个关键问题:进制枚举、字母对应数的枚举、矩阵转竖式以及正确性判断,并给出了相应的解决方案和代码实现。最后,博主总结了时间复杂度,并提醒注意数字竖式数组的清空以避免错误。
摘要由CSDN通过智能技术生成

主体思路:DFS

一看到题,有点蒙,大致思考了以后,我想起了以前做过的NOIP2004年的虫食算鬼畜竖式题
于是,我构起了这道题的大致框架:将矩阵分解成一个个竖式(在程序中有Size个竖式),并对每个字母所对应的数进行枚举,最后写出答案

在做程序中,需要思考以下几个问题:

(一)进制的枚举
最开始我以为进制是在M(不重复字母个数),和N-1(第一行的字母总数)之间,后来发现两者的值一直相同,这个问题就引刃而解了。想多了
(二)每个字母所对应的数的枚举
太简单了!(FJJ说的),这个就是本程序搜索的主体,本蒟蒻认为只要是学过DFS的人都会——定义一个递归函数,函数有一个参量,就是矩阵(输入的那个)的第一行的每一列(从2到N),指的是每个字母,在递归函数中放一个循环,从0循环到Top-1(注意是从0开始,不是1,Top指的是Top进制),枚举每个字母所代表的数——解决了!
在这里我还用了STL里面的map,用在这里是将一个字符串作为下标来存储布尔值或整形(如果不懂得在这里推荐一个网址:https://blog.csdn.net/jocelyn_ln/article/details/52055565)
代码:

void Depth_First_Search(int Last){//枚举每个字母
//注意了,这里还少东西,等一会会讲
	for(int i=0;i<Top;i++){//枚举每个字母所对应的数 
		if(Used[i]==false){//如果这个数没有用过 
			if(Judge2[Map[1][Last][0]]==-1){//如果这个字母未赋值 
				Used[i]=true;//确定这个数用过 
				Judge2[Map[1][Last][0]]=i;//个这个字母赋值 
				Depth_First_Search(Last+1);//确定下一个字母 
				Judge2[Map[1][Last][0]]=-1;
				Used[i]=false;//回溯 
			}
		}
	}
}

(三)如何将矩阵做成竖式
将整个矩阵扫一遍,用一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值