ZOJ-1275

来源:互联网 发布:php获取时间 编辑:程序博客网 时间:2024/05/18 03:30

不算太难的DFS,按给出的要求搜吧,注意细节的处理,结果要求输出大于给定整数的最小满足条件的数,其实我这程序也不大严谨,因为只搜了相同长度的情况,如果输入中有999这种数的话,肯定就要从长度为4的串开始搜了,看了标准测试数据没有这样的情况。。所以就偷懒了

#include<iostream>#include<cstring>#include<climits>#include<cstdlib>using namespace std;namespace{int len, begin, num, minn, src[7];bool flag[10], finish;int number(){int res = 0;for (int i = 0; i < len; i++)res = res * 10 + src[i];return res;}void dfs(int depth, int index){if (src[index]){if (depth == len && index == 0){int now = number();if (now >= num && now < minn)minn = now;}return;}for (int i = 1; i < 10; i++){if (depth == 0 && i < begin)continue;int next = (i + index) % len;if (!flag[i]){flag[i] = true;src[index] = i;dfs(depth + 1, next);src[index] = 0;flag[i] = false;}}}}int main(){string s;int cs = 0;while (cin >> s, s != "0"){len = s.size();begin = s[0] - '0';memset(src, 0, sizeof(src));memset(flag, 0, sizeof(flag));finish = false;num = atoi(s.c_str());minn = INT_MAX;dfs(0, 0);cout << "Case " << (++cs) << ": " << minn << endl;}return 0;}


0 0