主体思路:DFS
一看到题,有点蒙,大致思考了以后,我想起了以前做过的NOIP2004年的虫食算鬼畜竖式题 。
于是,我构起了这道题的大致框架:将矩阵分解成一个个竖式(在程序中有Size个竖式),并对每个字母所对应的数进行枚举,最后写出答案。
在做程序中,需要思考以下几个问题:
(一)进制的枚举
最开始我以为进制是在M(不重复字母个数),和N-1(第一行的字母总数)之间,后来发现两者的值一直相同,这个问题就引刃而解了。想多了
(二)每个字母所对应的数的枚举
太简单了!(FJJ说的),这个就是本程序搜索的主体,本蒟蒻认为只要是学过DFS的人都会——定义一个递归函数,函数有一个参量,就是矩阵(输入的那个)的第一行的每一列(从2到N),指的是每个字母,在递归函数中放一个循环,从0循环到Top-1(注意是从0开始,不是1,Top指的是Top进制),枚举每个字母所代表的数——解决了!
在这里我还用了STL里面的map,用在这里是将一个字符串作为下标来存储布尔值或整形(如果不懂得在这里推荐一个网址:https://blog.youkuaiyun.com/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;//回溯
}
}
}
}
(三)如何将矩阵做成竖式
将整个矩阵扫一遍,用一