• poj1110double vision搜索


    题目:http://poj.org/problem?id=1110

    其实思路挺简单,不过题意确实不够明了,而且从网页上都看不出来题目中那几个数字- -行间距太大了,粘下来放到文本里就能看出是01234

    对每个symbol遍历各种可能的情况,从上到下,每行从左到右,看看某位置(或某两个位置)其他symbol是不是'o',如果存在其他symbol相应位置上是'o',就说明这个不是unique的,不符合要求,继续找,找不到就是impossible

    这个代码有点罗嗦,抽空看看精简一下,有个题解似乎结构更好一点,在这里http://shaidaima.com/source/view/10279

    //double vision搜索
    #include <cstdio>
    char a[10][81];
    int n, r, c;//n--num of symbols, r/c--num of rows/cols in each grid
    int upper_bound;
    bool search(int x){
        int begin = x * (c + 1);
        int end = begin + c - 1;//inclusive
        for(int i = 0; i < r; i++){
            for(int j = begin; j <= end; j++){
                if(a[i][j] == 'o'){
                    int fwd = j, bwd = j;//forward,backward
                    //bool pass = false;
                    while((bwd -= (c + 1)) >= 0){
                        if(a[i][bwd] != '.'){
                            break;
                        }
                    }
                    if(bwd >= 0){//come from break, not qualified
                        continue;
                    }
                    while((fwd += (c + 1)) <= upper_bound){
                        if(a[i][fwd] != '.'){
                            break;
                        }
                    }
                    if(fwd <= upper_bound){//come from break, not qualified
                        ;//do nothing, loop again, find another one
                    }else{
                        a[i][j] = '#';
                        return true;
                    }
                }
            }
        }
        //check 2#...
        //
        for(int i = 0; i < r; i++){
            for(int j = begin; j <= end; j++){
                if(a[i][j] != 'o'){
                    continue;
                }
                for(int s = i; s < r; s++){
                    for(int t = (s == i ? j + 1: begin); 
                            t <= end; t++){
                        if(a[s][t] != 'o'){
                            continue;
                        }
                        int fwd1 = j, bwd1 = j;//1--ith row
                        int fwd2 = t, bwd2 = t;//2--jth row
                        while((bwd1 -= (c + 1)) >= 0){
                            bwd2 -= (c + 1);
                            if(a[i][bwd1] != '.' && a[s][bwd2] != '.'){
                                //not qualified, because not unique.本来这里的判断写成== 'o',这个不对,因为有些已经被改成#了
                                break;
                            }
                        }
                        if(bwd1 >= 0){//from break
                            continue;
                        }
                        while((fwd1 += (c + 1)) <= upper_bound){
                            fwd2 += c + 1;
                            if(a[i][fwd1] != '.'&& a[s][fwd2] != '.'){
                                break;
                            }
                        }
                        if(fwd1 <= upper_bound){//come from break, not qualified
                            ;//do nothing, loop again, find another one
                        }else{
                            a[i][j] = '#';
                            a[s][t] = '#';
                            return true;
                        }
                    }
                }
            }
        }
    
        return false;
    }
    int main()
    {
        int i;
        int cnt = 1;
        while(scanf("%d%d%d\n", &n, &r, &c) != EOF && n != 0){
            printf("Test %d\n", cnt++);
            upper_bound = (c + 1) * (n - 1) + c - 1;//last element
            for(i = 0; i < r; i++){
                fgets(a[i], 81, stdin);
            }
            for(i = 0; i < n; i++){
                if(!search(i)){//check whether symbol i has unique #
                    printf("impossible\n");
                    break;
                }
            }
            if(i == n){
                for(i = 0; i < r; i++){
                    printf("%s", a[i]);
                }
            }
        }
        return 0;
    }
    //下面这个把search函数2个while循环变为1个while循环和一个for循环,更好理解一点,效率低了一点点,代码少了13行,main没变
    View Code
     1 //double vision搜索
     2 #include <cstdio>
     3 char a[10][81];
     4 int n, r, c;//n--num of symbols, r/c--num of rows/cols in each grid
     5 int upper_bound;
     6 bool search(int x){
     7     int begin = x * (c + 1);
     8     int end = begin + c - 1;//inclusive
     9     for(int i = 0; i < r; i++){
    10         for(int j = begin; j <= end; j++){
    11             if(a[i][j] == 'o'){
    12                 int k = j;//forward,backward
    13                 while(k >= c + 1){
    14                     k -= (c + 1);
    15                 }
    16                 for(; k <= upper_bound; k += c + 1){
    17                     if(a[i][k] != '.' && k != j){
    18                         break;
    19                     }
    20                 }
    21                 if(k <= upper_bound){//find another
    22                     continue;
    23                 }else{
    24                     a[i][j] = '#';
    25                     return true;
    26                 }
    27             }
    28         }
    29     }
    30     //check 2#...
    31     //
    32     for(int i = 0; i < r; i++){
    33         for(int j = begin; j <= end; j++){
    34             if(a[i][j] != 'o'){
    35                 continue;
    36             }
    37             for(int s = i; s < r; s++){
    38                 for(int t = (s == i ? j + 1: begin); 
    39                         t <= end; t++){
    40                     if(a[s][t] != 'o'){
    41                         continue;
    42                     }
    43                     int k1 = j, k2 = t;//forward,backward
    44                     while(k1 >= c + 1){
    45                         k1 -= (c + 1);
    46                         k2 -= (c + 1);
    47                     }
    48                     for(; k1 <= upper_bound; 
    49                             k1 += c + 1, k2 += c + 1){
    50                         if(a[i][k1] != '.' && a[s][k2] != '.' 
    51                                 && k1 != j){
    52                             break;
    53                         }
    54                     }
    55                     if(k1 <= upper_bound){//find another
    56                         continue;
    57                     }else{
    58                         a[i][j] = '#';
    59                         a[s][t] = '#';
    60                         return true;
    61                     }
    62                 }
    63             }
    64         }
    65     }
    66     return false;
    67 }
    68 int main()
    69 {
    70     int i;
    71     int cnt = 1;
    72     while(scanf("%d%d%d\n", &n, &r, &c) != EOF && n != 0){
    73         printf("Test %d\n", cnt++);
    74         upper_bound = (c + 1) * (n - 1) + c - 1;//last element
    75         for(i = 0; i < r; i++){
    76             fgets(a[i], 81, stdin);
    77         }
    78         for(i = 0; i < n; i++){
    79             if(!search(i)){//check whether symbol i has unique #
    80                 printf("impossible\n");
    81                 break;
    82             }
    83         }
    84         if(i == n){
    85             for(i = 0; i < r; i++){
    86                 printf("%s", a[i]);
    87             }
    88         }
    89     }
    90     return 0;
    91 }
     1  //double vision搜索
     2 #include <cstdio>
     3 char a[10][81];
     4 int n, r, c;//n--num of symbols, r/c--num of rows/cols in each grid
     5 int upper_bound;
     6 bool search(int x){
     7     int begin = x * (c + 1);
     8     int end = begin + c - 1;//inclusive
     9     for(int i = 0; i < r; i++){
    10         for(int j = begin; j <= end; j++){
    11             if(a[i][j] == 'o'){
    12                 int k = j;//forward,backward
    13                 while(k >= c + 1){
    14                     k -= (c + 1);
    15                 }
    16                 for(; k <= upper_bound; k += c + 1){
    17                     if(a[i][k] != '.' && k != j){
    18                         break;
    19                     }
    20                 }
    21                 if(k <= upper_bound){//find another
    22                     continue;
    23                 }else{
    24                     a[i][j] = '#';
    25                     return true;
    26                 }
    27             }
    28         }
    29     }
    30     //check 2#...
    31     //
    32     for(int i = 0; i < r; i++){
    33         for(int j = begin; j <= end; j++){
    34             if(a[i][j] != 'o'){
    35                 continue;
    36             }
    37             for(int s = i; s < r; s++){
    38                 for(int t = (s == i ? j + 1: begin); 
    39                         t <= end; t++){
    40                     if(a[s][t] != 'o'){
    41                         continue;
    42                     }
    43                     int k1 = j, k2 = t;//forward,backward
    44                     while(k1 >= c + 1){
    45                         k1 -= (c + 1);
    46                         k2 -= (c + 1);
    47                     }
    48                     for(; k1 <= upper_bound; 
    49                             k1 += c + 1, k2 += c + 1){
    50                         if(a[i][k1] != '.' && a[s][k2] != '.' 
    51                                 && k1 != j){
    52                             break;
    53                         }
    54                     }
    55                     if(k1 <= upper_bound){//find another
    56                         continue;
    57                     }else{
    58                         a[i][j] = '#';
    59                         a[s][t] = '#';
    60                         return true;
    61                     }
    62                 }
    63             }
    64         }
    65     }
    66     return false;
    67 }
    68 int main()
    69 {
    70     int i;
    71     int cnt = 1;
    72     while(scanf("%d%d%d\n", &n, &r, &c) != EOF && n != 0){
    73         printf("Test %d\n", cnt++);
    74         upper_bound = (c + 1) * (n - 1) + c - 1;//last element
    75         for(i = 0; i < r; i++){
    76             fgets(a[i], 81, stdin);
    77         }
    78         for(i = 0; i < n; i++){
    79             if(!search(i)){//check whether symbol i has unique #
    80                 printf("impossible\n");
    81                 break;
    82             }
    83         }
    84         if(i == n){
    85             for(i = 0; i < r; i++){
    86                 printf("%s", a[i]);
    87             }
    88         }
    89     }
    90     return 0;
    91 }
     
  • 相关阅读:
    关于宇宙大爆炸的理论模型
    算法系列2《RSA》
    Codeforces Round #248 (Div. 1)——Nanami&#39;s Digital Board
    Cocos2d-x场景变化相关功能介绍
    NYOJ 745 蚂蚁问题(两)
    quick-cocos2d-x endToLua 退出会卡住
    编程算法
    linux基础知识1
    URAL 1553. Caves and Tunnels 树链拆分
    2014/11/13_ 随想
  • 原文地址:https://www.cnblogs.com/fstang/p/2793835.html
Copyright © 2020-2023  润新知