LeeLdler喜欢下棋 题解

LeeLdler喜欢下棋

https://ac.nowcoder.com/acm/contest/3667/L

我过了带模拟 我好快乐 我是快乐的小熊软糖
吉首大学新生赛的带模拟 下井字棋问自己两步能不能赢
其实也不算很大233
代码长度3185 生涯之耻(不是
注释应该蛮清楚的(挠头
要注意的一点是如果初始局面自己已经获胜了 这个时候算wrong

#include<bits/stdc++.h>
#define pf printf
#define sc(x) scanf("%d", &x)
#define scs(x) scanf("%s", x)
#define scl(x) scanf("%lld", &x)
#define mst(a,x) memset(a, x, sizeof(a))
#define rep(i,s,e) for(int i=s; i<e; ++i)
#define dep(i,e,s) for(int i=e; i>=s; --i)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 5e5 + 5;
char mp[3][3],c,d,t,p;
map<char,int>aaa;
int judge(char x){
    rep(i,0,3) if(mp[i][0]==x&&mp[i][1]==x&&mp[i][2]==x) return 1;
    rep(i,0,3) if(mp[0][i]==x&&mp[1][i]==x&&mp[2][i]==x) return 1;
    if(mp[0][0]==x&&mp[1][1]==x&&mp[2][2]==x) return 1;
    if(mp[0][2]==x&&mp[1][1]==x&&mp[2][0]==x) return 1;
    return 0;
}
int count(char x){
    rep(i,0,3) if((mp[i][0]==x)+(mp[i][1]==x)+(mp[i][2]==x)>=2
    &&(mp[i][0]=='.'||mp[i][1]=='.'||mp[i][2]=='.')) return t=1,p=i,1;
    rep(i,0,3) if((mp[0][i]==x)+(mp[1][i]==x)+(mp[2][i]==x)>=2
    &&(mp[0][i]=='.'||mp[1][i]=='.'||mp[2][i]=='.')) return t=2,p=i,1;
    if((mp[0][0]==x)+(mp[1][1]==x)+(mp[2][2]==x)>=2
    &&(mp[0][0]=='.'||mp[1][1]=='.'||mp[2][2]=='.')) return t=3,1;
    if((mp[2][0]==x)+(mp[1][1]==x)+(mp[0][2]==x)>=2
    &&(mp[2][0]=='.'||mp[1][1]=='.'||mp[0][2]=='.')) return t=4,1;
    return 0;
}
int find(char x){
    rep(i,0,3) if(mp[i][0]!=x&&mp[i][1]!=x&&mp[i][2]!=x) return t=1,p=i,1;
    rep(i,0,3) if(mp[0][i]!=x&&mp[1][i]!=x&&mp[2][i]!=x) return t=2,p=i,1;
    if(mp[0][0]!=x&&mp[1][1]!=x&&mp[2][2]!=x) return t=3,1;
    if(mp[0][2]!=x&&mp[1][1]!=x&&mp[2][0]!=x) return t=4,1;
    return 0;
}
int solve(){
    getchar(); aaa.clear(); rep(i,0,3) rep(j,0,3){
        mp[i][j]=getchar(); aaa[mp[i][j]]++; getchar();
    } c=getchar(); d='o'+'x'-c; if(aaa[c]!=aaa[d]) return puts("wrong!");
    if(!aaa['.']||judge(d)||judge(c)) return puts("wrong!");
    if(aaa['.']==9||aaa[c]==1) return puts("Cannot win!");
    //一种是 自己第一步能赢
    if(count(c)) return puts("LeeLdler win!");
    //一种是 自己不能一步赢 人机能一步赢 先堵人机
    //count d 然后根据t去改mp 改完再去count c 
    if(count(d)){
        if(t==1) rep(i,0,3) if(mp[p][i]=='.') mp[p][i]=c;
        else if(t==2) rep(i,0,3) if(mp[i][p]=='.') mp[p][i]=c;
        else if(t==3) rep(i,0,3) if(mp[i][i]=='.') mp[i][i]=c;
        else rep(i,0,3) if(mp[i][2-i]=='.') mp[i][2-i]=c;
        return puts(count(c)?"LeeLdler win!":"Cannot win!");
    }
    //一种是 自己和人机不能一步赢 下自己的 人机去堵
    //这时候你选的应该是一个空列 指一行只有自己和空位 
    //如果没有空列 肯定赢不了 
    //一个空列有两种情况 两种都判一下 
    if(!find(d)) return puts("Cannot win!"); else{
        int tp1,tp2; if(t==1){
            rep(i,0,3) if(mp[p][i]=='.'){
                mp[p][i]=c,tp1=i; break;
            } rep(i,0,3) if(mp[p][i]=='.'){
                mp[p][i]=d,tp2=i;
            } if(count(c)) return puts("LeeLdler win!");
            mp[p][tp1]=d,mp[p][tp2]=c; 
            if(count(c)) return puts("LeeLdler win!");
            return puts("Cannot win!");
        } else if(t==2){
            rep(i,0,3) if(mp[i][p]=='.'){
                mp[i][p]=c,tp1=i; break;
            } rep(i,0,3) if(mp[i][p]=='.'){
                mp[i][p]=d,tp2=i;
            } if(count(c)) return puts("LeeLdler win!");
            mp[tp1][p]=d,mp[tp2][p]=c; 
            if(count(c)) return puts("LeeLdler win!");
            return puts("Cannot win!");
        } else if(t==3){
            rep(i,0,3) if(mp[i][i]=='.'){
                mp[i][i]=c,tp1=i; break;
            } rep(i,0,3) if(mp[i][i]=='.'){
                mp[i][i]=d,tp2=i;
            } if(count(c)) return puts("LeeLdler win!");
            mp[tp1][tp1]=d,mp[tp2][tp2]=c;
            if(count(c)) return puts("LeeLdler win!");
            return puts("Cannot win!");
        } else{
            rep(i,0,3) if(mp[i][2-i]=='.'){
                mp[i][2-i]=c,tp1=i; break;
            } rep(i,0,3) if(mp[i][2-i]=='.'){
                mp[i][2-i]=d,tp2=i;
            } if(count(c)) return puts("LeeLdler win!");
            mp[tp1][2-tp1]=d,mp[tp2][2-tp2]=c;
            if(count(c)) return puts("LeeLdler win!");
            return puts("Cannot win!");
        }
    } 
}
int main(){
    int _; sc(_); while(_--) solve();
}

哈哈我过了!
写模拟能直接a真的好快乐!!

全部评论

相关推荐

我只是一个小白菜:我还用不惯m4,也是山猪吃不了细糠了
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务