[ABC361D]Go Stone Puzzle
题目大意
给定一个字符串S,它是由B和W组成,之后在S后面添加两个空格,可以将相邻的两个字符和空格进行交换,交换的前提是只能相邻,同时两个字符必须都是B或者W,再给一个字符串T,也是由B和W组成,问最小经过几次交换,使得S变成T
\(1 \leq |S| \leq 14\)
题解:
看到数据范围,一看就知道是个搜索,怎么搜索?
\(dfs(int k,int p,int sum)\)表示就是搜索到第k个位置,空格在第p个位置,交换次数为sum
对于每个位置,我们可以进行交换,也可以不进行交换,这样搜索有一个问题,我这里是顺序搜索,字符和空格进行交换,但是空格也可以和字符交换,顺序搜索已经到空格了,我们无法知道他的交换范围,如果我们进行了交换,他交换了回去我们就无法搜索了,因为是顺序搜索,所以这个搜索是错的
经过学生提醒,这个是bfs,我突然想到该怎么做了,我把每一种交换状态记录下来,同时使用map记录一下每一个状态有没有被记录过,这个题就很容易做了
这个题最重要的启示就是看到数据范围小的话,只想到dfs,看到最小步骤的话,还可以想到bfs