Educational Codeforces Round 25 B Five-In-a-Row 基础题

来源:互联网 发布:东莞网络 编辑:程序博客网 时间:2024/06/07 20:23

CF传送门

题解:问在棋盘的空位上再放一个X棋是否能使X胜利

题解:

1. 暴力搜索就行了,图才10X10,随便嵌套五六个循环都不会超时,所以这题就随便写

2. CF给出的题解是直接对图进行遍历看看是否存在五个连线点上是4个"X"和1个"."的情况,有就YES

3. 我写的是先遍历图把可能的点补上再搜五连点,我的复杂度要比CF题解多出几个循环,但还是过了


以下是我的AC代码:

#include <iostream>using namespace std;char s[15][15];bool win(){    for(int i=0;i<10;i++)    {        for(int j=0;j<10;j++)        {            if(s[i][j]=='X')            {                int u=i,v=j,sum=0;                while(v<10&&s[u][v]=='X'){sum++;v++;}           //右直线                if(sum==5) return true;                u=i;v=j;sum=0;                while(u<10&&s[u][v]=='X'){sum++;u++;}           //下直线                if(sum==5) return true;                u=i;v=j;sum=0;                while(u<10&&v<10&&s[u][v]=='X'){sum++;u++;v++;} //右下直线                if(sum==5) return true;                u=i;v=j;sum=0;                while(u<10&&v>=0&&s[u][v]=='X'){sum++;u++;v--;} //左下直线                if(sum==5) return true;            }        }    }    return false;}int main(){    for(int i=0;i<10;i++)        cin >> s[i];    for(int i=0;i<10;i++)        for(int j=0;j<10;j++)            if(s[i][j]=='X')                for(int v=-1;v<=1;v++)                    for(int u=-1;u<=1;u++)                        if(i+v>=0&&i+v<10&&j+u>=0&&j+u<10&&s[i+v][j+u]=='.'){                            s[i+v][j+u]='X'; //更改点的状态                            if(win()){                                cout << "YES" << endl;                                return 0;                            }                            s[i+v][j+u]='.'; //记得还原改变的点的状态                        }    cout << "NO" << endl;    return 0;}

原创粉丝点击