前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一道快乐的井字棋带模拟

一道快乐的井字棋带模拟

作者头像
wenzhuan
发布2022-08-15 12:22:17
2820
发布2022-08-15 12:22:17
举报
文章被收录于专栏:你会烧尽还是结冰

我过了带模拟 我好快乐 我是快乐的小熊软糖

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

代码语言:javascript
复制
#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真的好快乐!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档