P4470 [BJWC2018]售票

https://www.luogu.com.cn/problem/P4470
涉及知识点:模拟,字符串,枚举暴力
橙色题
思路:
  • 先输入n个,目的地名称,再输入已经输进去的字母
  • 然后对于每一个输入进去的字母都进行判断是否和目的地一致(只要有一个不一样就做标记,在最后搜索时跳过)
  • 对于每一个目的地,只要没被做过标记那么他的没输入的下一个字母就在输出的表数组上记录
  • 最后输出一个表

注:需特别注意最后的换行顺序,本题只需认真模拟就可以做出来。


 

代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[51],l;
char b[51][101];
char s[101];
char m[33];
int main(){
    cin>>n; 
    for(int i=1;i<=n;i++){
        cin>>b[i];//输入每个字符串 
        a[i]=1;//后面判断是否符合条件 
    }
    cin>>s;//输入已经输入的字符串 
    l=strlen(s);//数一下输入了几个数据 
    for(int i=0;i<l;i++){//对于每一个字母判断 
        for(int j=1;j<=n;j++){
            if(a[j]==1&&b[j][i]!=s[i])a[j]=0;//如果不相符那么a变成0,a为0以后就不搜索了 
        }
    }
    for(int i=1;i<=32;i++){//m[32]代表要输出的4*8的表格 
        m[i]='*';//先都赋值为* 
    }
    for(int i=1;i<=n;i++){//对每一个输入都进行判断 
        if(a[i]==1)m[b[i][l]-61]=b[i][l];//如果所有字符都符合那么应该a为1,
        //如果a为1那么他和数据一直相符,将下一位的字母存进m函数里 
    }
    for(int i=1;i<=32;i++){//输出表格 
        cout<<m[i];
        if(i%8==0)cout<<endl;//只要是8的倍数就换行 
    }
    return 0;
}

 

 

 b[i][l]-61


 

方法二:

#include <cstdio>
#include <cstring>
short n,l;
char a[51][101],s[101],k[]={"********\n********\n********\n********"};//省的换行
int main(void){
    scanf ("%d\n",&n);
    for (short i=0;i<n;i++)scanf ("%s\n",&a[i]);
    scanf ("%s",s),l=strlen(s);
    for (short i=0;i<n;i++)if (!strncmp(a[i],s,l)){//比较
        char c=a[i][l];
        if('A'<=c&&c<='E')k[c-'A'+3]=c;
        if('F'<=c&&c<='M')k[c-'A'+4]=c;
        if('N'<=c&&c<='U')k[c-'A'+5]=c;
        if('V'<=c&&c<='Z')k[c-'A'+6]=c;//设置为可见
    }
    puts(k);//直接输出
}

strncmp,可以直接比较两个字符串的前n位

 

 

posted @ 2022-07-05 10:31  -イレイナ  阅读(34)  评论(0)    收藏  举报