日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【51NOD - 1523】 非回文(dfs)

發(fā)布時(shí)間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【51NOD - 1523】 非回文(dfs) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題干:

一個(gè)字符串是非回文的,當(dāng)且僅當(dāng),他只由前p個(gè)小寫(xiě)字母構(gòu)成,而且他不包含長(zhǎng)度大于等于2的回文子串。

給出長(zhǎng)度為n的非回文串s。請(qǐng)找出字典序比s大的,而且字典序要最小的長(zhǎng)度為n的非回文。


Input單組測(cè)試數(shù)據(jù)。?
第一行有兩個(gè)整數(shù)n 和p (1≤n≤1000; 1≤p≤26)。?
第二行包含一個(gè)字符串s,它的長(zhǎng)度是n。輸入保證他是非回文的。Output輸出字典序比s大的且字典序要最小的長(zhǎng)度為n的非回文,如果不存在輸出NO。Sample Input 樣例輸入1 3 3 cba 樣例輸入2 3 4 cbaSample Output 樣例輸出1 NO 樣例輸出2 cbd

解題報(bào)告:

? ? 首先分析出非回文的標(biāo)志語(yǔ)句,歸納推出是s[i] ! = s[i-1] && s[i] != s[i-2] ,然后用dfs搜索字典序增大的就可以了。


ac代碼:

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int len; int n,p; char s[1000+5],ss[1000+5];//s復(fù)制到ss,對(duì)s做修改 bool bk[1000+5]; bool ok() {if(s[0]==s[1]) return false;for(int i = 2; i<len; i++) {if(s[i]==s[i-1]||s[i]==s[i-2]) return false;}if(strcmp(ss,s)==0) return false;return true; } bool dfs(int step) {if(step>n) return false;if(step==n) {if(ok() ) {printf("%s\n",s);return true;}return false;}char i;bk[step]==1 ? i='a' : i = ss[step];bk[step]=1; for(; i<=96+p; i++) {if(step>=2) {if(i==s[step-1]||i==s[step-2]) continue; }else if(step==1) if(i==s[step-1]) continue;s[step]=i;//還是直接放在for下面也無(wú)所謂? if(dfs(step+1) ) return true;}return false; } int main() {while(~scanf("%d%d",&n,&p)) {memset(s,0,sizeof(s));memset(ss,0,sizeof(ss));memset(bk,0,sizeof(bk));scanf("%s",s);strcpy(ss,s);len=strlen(s);if(!dfs(0) ) {printf("NO\n");}}return 0 ; }

法2:(不用深搜)

#include <cstdio> #include <cstring> using namespace std; const int MAXN = 1005;char str[MAXN];int main() {int n, p;scanf("%d%d%s", &n, &p, str + 1);for (int i = n; i >= 1; i--) {int x = str[i] - 'a';if (x < p - 1) {int y = -1;for (int j = x + 1; j < p; j++) {char c = 'a' + j;if (i > 1 && c == str[i - 1]) continue;if (i > 2 && c == str[i - 2]) continue; y = j;break;}if (y == -1) continue;str[i] = 'a' + y;//printf("%d : %c\n", i, 'a' + y);if (i == n) {puts(str + 1);return 0;}for (int j = i + 1; j <= n; j++) {for (int k = 0; k < p; k++) {char c = 'a' + k;if (j > 1 && c == str[j - 1]) continue;if (j > 2 && c == str[j - 2]) continue; str[j] = c;break;}}puts(str + 1);return 0;}}puts("NO");return 0; }




總結(jié):注意字典序搜索的時(shí)候,不能都從 ss[step] 開(kāi)始,需要有一個(gè)bk標(biāo)記數(shù)組,因?yàn)榈谝淮斡猛曛筮€需要從'a'開(kāi)始,而不是ss[step]



總結(jié)

以上是生活随笔為你收集整理的【51NOD - 1523】 非回文(dfs)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。