重要的事情说三遍
!!!该答案并非最简题解!!!
!!!该答案并非最简题解!!!
!!!该答案并非最简题解!!!
今天模考订正时 无意间翻到了这道<20469>nice串
题目不难 但我的思路蛮有意思的 分享给大家
dfs内4个参数
int x,double len,char y,int cnt;
分别表示字符串的起始位置,长度,需要判断的小写字母,和当前的修改次数
依题意得 当字符串的起始位置为x 长度为len时
可能到达的位置为
now_x=x+len*dx[i]
其中
dx[]={-1,1,-0.5,1.5};
如下图
y*y*x&&&
x&&&y*y*
(x表示当前位置,&表示已遍历位置,*表示未遍历位置,y表示可能到达的位置)
判断越界和已访问的情况
if(now_x>=n||now_x<0||vis[now_x]==1) continue;
进入深一层的dfs
dfs(now_x,len/2,char(y+1),cnt);
将now_x到now_x+len/2-1 将vis数组还原为0
在dfs的开头先判断此时的len是否等于0.5
如果等于就判断str[x ]的值
ans=min(ans,cnt)
然后return
如果不等于 就判断x到x+len-1的字符是否等于y
同时将cnt++ 将vis数组置1
在主函数中需分两种情况搜索
dfs(0,n/2,'a',0);
dfs(n/2,n/2,'a',0);
分别表示起始位置为 0 和 len/2 的2种情况