AtCoder abc232 刷题总结

A - QQ solver

题目翻译

给你一个由三个字符组成的字符串,就是两个字符之间有一个x,两边的字符介于19之间。

题目解析

淼题速切,不解释。

正确代码
#include
using namespace std;
int main(){
    char a,b;
    scanf("%cx%c",&a,&b);
    cout<<((a-'0')*(b-'0'));
}

B - Caesar Cipher

题目翻译

Takahashi有一个字符串S,该字符串由小写英文字母组成,在这个字符串上,他可以做以下操作,只能做一次。

  • 首先,选择一个非负整数K。
  • 然后,将字符串S中的字母全部右移K。(见下文)
    这里
  • a右移一位后变为b
  • b右移一位后变为c
  • c右移一位后变为d
  • y右移一位后变为z
  • z右移一位后变为a

给你字符串S和T,判断Takahashi是否能够将S变为T。

题目解析

用两个字符串的第一个字符求出它们的差值,记得加上26再mod26,这样能保证该差值为非负数。然后再用差值将t数组推出,再比较推出的数组和t数组是否相等。

正确代码
#include 
using namespace std;
char s[100005], t[100005];
long long c[100005];
int main() {
    scanf("%s", s);
    scanf("%s", t);
    long long len = strlen(s);
    long long tt = (t[0] + 26 - s[0]) % 26;
    for (long long i = 1; i < len; i++) {
        long long ttt = (t[i] + 26 - s[i]) % 26;
        if (ttt != tt) {
            cout << "No";
            return 0;
        }
    }
    cout << "Yes";
}

C - Graph Isomorphism

题目翻译

在这里插入图片描述

题目解析

首先看数据范围, n ≤ 8 n\leq8 n8?!还是全排列?!那就直接处理出n个数的全排列,再暴力尝试即可AC。

正确代码
#include
using namespace std;
long long n,m;
long long a[101][2];
long long b[101][101];
long long c[50005][101],cnt;
long long s[101];
bool vis[101];
void dfs(long long x){
    if(x>n){
        cnt++;
        for(long long i=1;i<=n;i++){
            c[cnt][i]=s[i];
        }
        return ;
    }
    for(long long i=1;i<=n;i++){
        if(!vis[i]){
            vis[i]=true;
            s[x]=i;
            dfs(x+1);
            vis[i]=false;
        }
    }
}
int main(){
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=m;i++){
        scanf("%lld%lld",&a[i][0],&a[i][1]);
    }
    for(long long i=1;i<=m;i++){
        long long x,y;
        scanf("%lld%lld",&x,&y);
        b[x][y]=1;
        b[y][x]=1;
    }
    dfs(1);
    for(long long i=1;i<=cnt;i++){
        bool flag=true;
        for(long long j=1;j<=m;j++){
            long long x=a[j][0],y=a[j][1];
            if(b[c[i][x]][c[i][y]]||b[c[i][y]][c[i][x]]){
            }else{
                flag=false;
                break;
            }
        }
        if(flag){
            cout<<"Yes";
            return 0;
        }
    }
    cout<<"No";
}

D - Weak Takahashi

题目翻译

在这里插入图片描述

题目解析

结合样例可得,从 ( 1 , 1 ) (1,1) (1,1)到其他点的最大距离即为可访问的最多格子数。直接使用BFS暴力求出从 ( 1 , 1 ) (1,1) (1,1)到其他点的距离,然后找出最大值。

正确代码
#include
using namespace std;
long long h,w;
long long mp[1001][1001];
bool vis[1001][1001];
long long f[1001][1001];
queue<pair<long long,long long> >q;
queue<long long>q1;
void bfs(){
    vis[1][1]=true;
    q.push(make_pair(1,1));
    q1.push(1);
    f[1][1]=1;
    while(!q.empty()){
        long long tx=q.front().first;
        long long ty=q.front().second;
        long long jl=q1.front();
        q.pop();
        q1.pop();
        if(!vis[tx][ty+1]&&mp[tx][ty+1]){
            vis[tx][ty+1]=true;
            f[tx][ty+1]=jl+1;
            q1.push(jl+1);
            q.push(make_pair(tx,ty+1));
        }
        if(!vis[tx+1][ty]&&mp[tx+1][ty]){
            vis[tx+1][ty]=true;
            f[tx+1][ty]=jl+1;
            q1.push(jl+1);
            q.push(make_pair(tx+1,ty));
        }
    }
}
int main(){
    scanf("%lld%lld",&h,&w);
    for(long long i=1;i<=h;i++){
        for(long long j=1;j<=w;j++){
            char ch;
            while(1){
                scanf("%c",&ch);
                if(ch=='.'||ch=='#'){
                    break;
                }
            }
            if(ch=='.')mp[i][j]=1;
        }
    }
    bfs();
    long long ans=0;
    for(long long i=1;i<=h;i++){
        for(long long j=1;j<=w;j++){
            ans=max(ans,f[i][j]);
        }
    }
    cout<<ans;
}

你可能感兴趣的:(题解,算法,c++,图论)