寒假集训 Day2 D CodeForces - 825B:五子棋

1.21 D题 CodeForces - 825B

题目大意:

给一个10*10棋盘,上面有棋子 X 和 0, 找出在一个空处放一个子使X连成五子或以上。

一个输入

解题思路:

正向思维:

1.找四个连一起的,然后判断是否可以在两端空位加棋子,这就要判断两端是否有空位;
2.找在中间加一个棋子可以把两个连在一起到比5大的。

反向思维:

找空位,判断垂直、水平、斜向是否有四个子或以上。
这个思路实现起来很容易,不过我在实现的时候重用了很多代码,写得很难看。

AC代码

#include<cstdio>
#include<iostream>
#include<queue>
#include<string>
#include<cmath>
#include<algorithm>
#include<limits.h>
#define rep(i,l,p) for(int i=l; i<=p; i++)
#define drep(i,p,l) for(int i=p; i>=l; i--)
using namespace std;

struct node{
    int x,y;
    node(int i,int j){
        x = i;
        y = j;
    }
};
int n;
int a[13][13];
queue<node> que;
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

    char t;
    rep(i,1,10){
        rep(j,1,10){
            cin >> t;
            if ( t == 'X') a[i][j] = 1;
            else if (t == 'O') a[i][j] = -1;    
            else {
                node *tt = new node(i,j);
                que.push(*tt);
            }
        } 
    }   
//  rep(i,1,10){
//      rep(j,1,10) printf("%d ",a[i][j]);
//      printf("\n");
//  }
    bool flag = false;
    while( !que.empty() ){

        node tmp = que.front();
        que.pop();

        int x = tmp.x, y = tmp.y; 
            //  printf("x:%d  y:%d\n",x,y);
        int res = 0;
        while( !flag ){
            y--;
            if (y < 1 ) break; 
        //  printf("a[%d][%d]:%d\n",x,y,a[x][y]);
            if ( a[x][y] == 1 ) res++;
            else break;
            if (res>=4) {
                flag = true;
                break;          
            }
        } 
        if ( flag ) break;
        x = tmp.x; y = tmp.y;
        while( !flag ){
            y++;
            if (y>10) break;
            if (a[x][y] == 1) res++;
            else break;
            if (res>=4){
                flag = true;
                break;
            }
        }
        //printf("%d\n",res);
        if ( flag ) break;
        x = tmp.x; y = tmp.y; 
        res = 0;
        while( !flag ){
            x--;
            if (x < 1 ) break; 
            if ( a[x][y] == 1 ) res++;
            else break;
            if (res>=4) {
                flag = true;
                break;          
            }
        } 
        if ( flag ) break;
        x = tmp.x; y = tmp.y;
        while( !flag ){
            x++;
            if (x>10) break;
            if (a[x][y] == 1) res++;
            else break;
            if (res>=4){
                flag = true;
                break;
            }
        }

        if ( flag ) break;
        x = tmp.x; y = tmp.y;
        res = 0;
        while( !flag ){
            x--;
            y--;
            if ( x <1 || y <1) break;
            if (a[x][y] == 1) res++;
            else break;
            if (res>=4){
                flag = true;
                break;
            }           
        }
        if ( flag ) break;
        x = tmp.x; y = tmp.y;
        while( !flag ){
            x++;
            y++;
            if ( x >10 || y >10) break;
            if (a[x][y] == 1) res++;
            else break;
            if (res>=4){
                flag = true;
                break;
            }           
        }



        if ( flag ) break;
        x = tmp.x; y = tmp.y;
        res = 0;
        while( !flag ){
            x--;
            y++;
            if ( x <1 || y >10) break;
            if (a[x][y] == 1) res++;
            else break;
            if (res>=4){
                flag = true;
                break;
            }           
        }
        if ( flag ) break;
        x = tmp.x; y = tmp.y;
        while( !flag ){
            x++;
            y--;
            if ( x >10 || y <1) break;
            if (a[x][y] == 1) res++;
            else break;
            if (res>=4){
                flag = true;
                break;
            }           
        }
    }

    if( flag ) printf("YES\n");
    else printf("NO\n"); 
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章