您的位置:首页 > 其它

ACM学习历程——HDU5202 Rikka with string(dfs,回文字符串)

2015-04-15 22:14 483 查看
[align=left]Problem Description[/align]
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:
One day, Yuta got a string which contains n letters but Rikka lost it in accident. Now they want to recover the string. Yuta remembers that the string only contains lowercase letters and it is not a palindrome string. Unfortunately he cannot remember some letters. Can you help him recover the string?
It is too difficult for Rikka. Can you help her?

[align=left]Input[/align]
This problem has multi test cases (no more than 20


). For each test case, The first line contains a number n(1≤n≤1000)


. The next line contains an n-length string which only contains lowercase letters and ‘?’ – the place which Yuta is not sure.

[align=left]Output[/align]
For each test cases print a n-length string – the string you come up with. In the case where more than one string exists, print the lexicographically first one. In the case where no such string exists, output “QwQ”.

[align=left]Sample Input[/align]

5
a?bb?
3
aaa

[align=left]Sample Output[/align]

aabba
QwQ

[align=left]Source[/align]
BestCoder Round #37 ($)

题目意思就是在?处填入小写字母,要求输出字典序最小的非回文字符串,否则输出QwQ。
这题用dfs对?处进行搜索就行。不过好久没写搜索,当时忘记回溯了,一直报WA。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <string>
#define inf 0xfffffff
#define eps 1e-10

using namespace std;

int n;
char str[1005];
bool flag;

void Input()
{
flag = false;
getchar();
for (int i = 0; i <= n; ++i)
{
str[i] = getchar();
}
}

void Output()
{
int i = 0;
while (str[i] != '\n')
{
printf("%c", str[i]);
i++;
}
printf("\n");
}

bool Cheak()
{
int len = n/2;
for (int i = 0; i < len; ++i)
{
if (str[i] != str[n-1-i])
return false;
}
return true;
}

void dfs(int i)
{
if (flag)
return;
while (str[i] != '?' && str[i] != '\n')
i++;
if (str[i] == '\n')
{
if (!Cheak())
{
flag = true;
}
return;
}
if (str[i] == '?')
{
for (char j = 'a'; j <= 'z'; ++j)
{
str[i] = j;
dfs(i+1);
if (flag)
return;
str[i] = '?';
}
}
}

int main()
{
//freopen("test.txt", "r", stdin);
while (scanf("%d", &n) != EOF)
{
Input();
dfs(0);
if (flag)
Output();
else
printf("QwQ\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: