P7765 KRIŽALJKA 题解

· · 题解

原题:P7765 [COCI 2011/2012 #5] KRIŽALJKA

思路:

1.输入

定义两个 char 类型字符串,用 scanf 读入 (注:scanf 遇到空格、回车和 Tab 键都会认为输入结束)。

char a[100001],b[100001];
scanf("%s",a);
scanf("%s",b);

2.记录

可以用两层 for 循环。如果找到第一个相同字母出现的位置以及字母,记录下,然后跳出第二层循环。

for(int i=la-1;i>=0;i--){
        for(int j=0;j<lb;j++){
            if(a[i]==b[j]){
                num_a=i;
                num_b=j;//记录相同字母的位置
                ta=a[i];
                tb=b[j];//记录相同字母 
                break;
            }
        }
    }

这里需要注意:外层循环对 \ {A} 数组的循环需要从后往前找,因为如果找到 \ {a_i} 等于 \ {b_j} ,只跳出了第二层 for 循环,此时的 \ {a_i} 不是第一个出现的。

3.输出

外层循环 \ {b} 数组的每一位,如果 \ {j} 等于 \ {num_b} ,则输出单词 \ {A} ,反之则循环 \ {a} 数组。如果 \ {i} 等于 \ {num_a} ,则输出 \ {b} 数组的元素,反之则输出 . 字符。

for(int j=0;j<lb;j++){
        if(j==num_b){
            for(int k=0;k<=la;k++){
                cout<<a[k];
            }
        }
        else for(int i=0;i<la;i++){
            if(i!=num_a){
                cout<<".";
            }
            else if(i==num_a){
                cout<<b[j];
            }
        }
        cout<<endl;
    }

最后附上完整 \ {O(n^2)} 代码:

#include<bits/stdc++.h>
using namespace std;
char a[100001],b[100001];
int main() 
{
    scanf("%s",a);
    scanf("%s",b);
    int la=strlen(a),lb=strlen(b),num_a,num_b;
    char ta,tb;
    for(int i=la-1;i>=0;i--){
        for(int j=0;j<lb;j++){
            if(a[i]==b[j]){
                num_a=i;
                num_b=j;//记录相同字母的位置
                ta=a[i];
                tb=b[j];//记录相同字母 
                break;
            }
        }
    }
    for(int j=0;j<lb;j++){
        if(j==num_b){
            for(int k=0;k<=la;k++){
                cout<<a[k];
            }
        }
        else for(int i=0;i<la;i++){
            if(i!=num_a){
                cout<<".";
            }
            else if(i==num_a){
                cout<<b[j];
            }
        }
        cout<<endl;
    }
    return 0;
}

这是本蒟蒻的第二篇题解,如有不当之处请指出。只会用n方的代码做了。