2.2.3 Runaround Numbers

17666 ワード

何も言うことのない強引な捜索.詳細はコードを参照してください.
コードは次のとおりです.

   
     
  1. /*
  2. ID: awsd1231
  3. PROG: runround
  4. LANG: C++
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<string>
  9. #include<cstring>
  10. using namespace std;
  11. unsigned long M;
  12. bool check(unsigned long x) {
  13. char buf[10];
  14. sprintf(buf, "%u", x);
  15. int ans[10][2] = {0};
  16. int len = strlen(buf);
  17. for (int i = 0; i != len - 1; ++i) {
  18. for (int j = i + 1; j != len; ++j) {
  19. if (buf[i] == buf[j] || !buf[j]) {
  20. return false;
  21. }
  22. }
  23. }
  24. for (int i = 0; i != len; ++i) {
  25. ans[i][0] = buf[i] - '0';
  26. }
  27. int idx = 0;
  28. if (ans[idx][0] >= len) {
  29. idx = ans[idx][0] % len;
  30. }
  31. else idx = ans[idx][0];
  32. for (int i = 0; i != len; ++i) {
  33. if (ans[idx][1]) return false;
  34. ans[idx][1] = 1;
  35. if (idx + ans[idx][0] >= len) {
  36. idx = (idx + ans[idx][0]) % len;
  37. }
  38. else
  39. idx += ans[idx][0];
  40. }
  41. return true;
  42. }
  43. int main () {
  44. freopen("runround.in", "r", stdin);
  45. freopen("runround.out", "w", stdout);
  46. cin >> M;
  47. for (unsigned long i = M + 1; ; ++i) {
  48. if (i % 10 && check(i)) {
  49. cout << i << endl;
  50. break;
  51. }
  52. }
  53. return 0;
  54. }