zoukankan      html  css  js  c++  java
  • 紫书第七章例题(暴力求解法)

    1.除法(Division, UVa 725)

    #include <cstdio>
    #include <cstring>
    bool isOk(int a, int b){
        char buff[20];
        int visited[15];
        memset(visited, 0, sizeof(visited));
        sprintf(buff, "%05d%05d", a, b);
        for (int i =0; i < 10; i++){
            int temp = buff[i] - '0';
            if (0 == visited[temp]){
                visited[temp]++;
            } else {
                return false;
            }
        }
        return true;
    }
    int main(void){
        int N, cnt = 0;
        bool flag = false;
        for (;scanf("%d", &N) && N;){
            if (cnt > 0){
                printf("
    ");
            }
            cnt++;
            flag = false;
            for (int i = 1234; i< 100000; i++){
                if (0 == i%N){
                    int ans = i/N;
                    if (isOk(i, ans)){
                        printf("%05d / %05d = %d
    ", i, ans, N);
                        flag = true;
                    } 
                }
            }
            if (!flag){
                 printf("There are no solutions for %d.
    ",N);
            }        
        }
        return 0;
    }
    View Code

    PE了,真是神奇,,C++处理字符串还是不够熟练。这种简单题目不能一次过就说明还是太水啊!!

    2.最大乘积(Maximum Product, UVa 11059)

     1 #include <cstdio>
     2 #include <cstring>
     3 #define ll long long
     4 int a[20], n, cnt;
     5 int main(void){
     6     for (cnt = 1;~scanf("%d", &n);cnt++){
     7         for (int i = 1; i <= n; i++){
     8             scanf("%d", &a[i]);
     9         }
    10         ll S = 1, maxn = 0;
    11         for (int i = 1; i <= n; i++){
    12             S = 1;//忘记
    13             for (int j = i; j <= n; j++){
    14                 S *= a[j];
    15                 if (S > maxn){
    16                     maxn = S;
    17                 }
    18             }
    19         }
    20         if (maxn < 0){
    21             maxn = 0;
    22         }
    23         printf("Case #%d: The maximum product is %lld.
    
    ", cnt, maxn);
    24         getchar();
    25     }
    26     return 0;
    27 }
    View Code

    WA,因为逻辑没理清,忘这忘那!!

     3.素数环(Prime Ring Problem, UVa 524)

     1 #include "cstdio"
     2 #include "cstring"
     3 #include "cmath"
     4 int n,vis[20], A[20];
     5 bool isPrime[50];
     6 
     7 void dfs(int cur){
     8     if (cur==n && isPrime[A[0]+A[n-1]]) {
     9         for (int i=0; i < n-1; i++)    printf("%d ", A[i]);
    10         printf("%d
    ", A[n-1]);
    11     } else {
    12         for (int i = 2; i <= n; i++) {
    13             if (!vis[i] && isPrime[i+A[cur-1]]) {
    14                 A[cur] = i;
    15                 vis[i] = 1;
    16                 dfs(cur+1);
    17                 vis[i] = 0;
    18             }
    19         }
    20     }
    21 }
    22 void check(){
    23     for (int i = 2; i < 50; i++){
    24         isPrime[i] = true;
    25         for (int k = 2; k < sqrt(i)+1; k++){
    26             if (i%k == 0){
    27                 isPrime[i] = false;
    28                 break;
    29             }
    30         }
    31     }
    32 }
    33 int main(int argc, char const *argv[])
    34 {
    35     int t = 0;
    36     check();
    37     for (;~scanf("%d", &n);){
    38         memset(vis, 0, sizeof(vis));
    39         A[0] = 1;
    40         if (t > 0){printf("
    ");}
    41         printf("Case %d:
    ", ++t);
    42         dfs(1);
    43     }
    44     return 0;
    45 }
    View Code

    这一题PE两次,空行输出真是个大坑。

     4.困难的串(Krypton Factor, UVa 129)

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <string>
     4 
     5 int n,L, cnt;
     6 char v[81];
     7 
     8 bool judge(int cur)
     9 {
    10     for(int i=1;i<=(cur+1)/2;i++)//判断长度为2*i的后缀是否有相同的
    11     {
    12         bool equal=1;
    13         for(int j=0;j<i;j++)
    14             if(v[cur-i-j]!=v[cur-j])  
    15             {
    16                 equal=0;
    17                 break;
    18             }
    19         if(equal)
    20             return false;
    21     }
    22     return true;
    23 }
    24 
    25 int dfs(int cur)
    26 {
    27     for(int i=0;i<L;i++)
    28     {
    29         v[cur]='A'+i;
    30         if(judge(cur))
    31         {
    32             cnt++;
    33             if(cnt==n)
    34             {
    35                  //attention format
    36                  for (int i=0; i<=cur; i++){
    37                      printf("%c", v[i]);
    38                      if ((i+1)%4 == 0 && i!=cur) {
    39                          printf(" ");
    40                      }
    41                      if (i!=cur && (i+1)%64==0){
    42                          printf("
    ");
    43                      }
    44                  }
    45                  printf("
    %d", cur+1);
    46                 return 1;
    47             }
    48             if(dfs(cur+1))
    49                 return 1;
    50         }
    51     }
    52     return 0;
    53 }
    54 
    55 int main()
    56 {
    57     for(;scanf("%d%d", &n, &L);) {
    58         cnt=0;
    59         dfs(0);    
    60     }
    61     return 0;
    62 }
    View Code

    超时!

     1 #include "cstdio"
     2 int n, L, cnt;
     3 int S[100];
     4 int dfs(int cur){ 
     5     if(cnt++ == n){
     6         for(int i = 0; i < cur; i++) {
     7             printf("%c", 'A'+S[i]);
     8             if ((i+1)!=cur && (i+1)%4 ==0 && (i+1)!=64){printf(" ");}
     9             if ((i+1)!=cur && (i+1)%64 == 0){printf("
    ");}
    10         }
    11         printf("
    %d
    ", cur);
    12     return 0;
    13     } 
    14     for(int i = 0; i < L; i++){
    15         S[cur] = i;
    16         int ok = 1;
    17         for(int j = 1; j*2 <= cur+1; j++){
    18             int equal = 1;
    19             for(int k = 0; k < j; k++)
    20                 if(S[cur-k] != S[cur-k-j]) { equal = 0; break; }
    21             if(equal) { ok = 0; break; }
    22         } 
    23         if(ok) if(!dfs(cur+1)) return 0;
    24     }
    25     return 1;
    26 }
    27 int main(int argc, char const *argv[])
    28 {
    29     for (;scanf("%d%d", &n, &L) && n;){
    30         cnt = 0;
    31         dfs(0);
    32     }
    33     return 0;
    34 }
    View Code

    PE三次,更可怕的是思路也被完全碾压,回溯!!

  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5707838.html
Copyright © 2011-2022 走看看