【FOJ】Problem 1490 五子棋

Problem 1490 五子棋.

思路

  • AC的思路
    最后一步落子的人,一定是胜利的人!
  • 第一个版本的思路WA
    二维数组存放棋局:0表示该位置没有棋子,B表示是黑子,W表示是白子
    ① 读入数组fir[20][20]
    ② 从上往下,左往右遍历每个位置:
    a.该位置(向右)有4个同色棋子——第五个位置也同色/两侧没有不同色的棋子,返回true
    b.该位置(向下)有4个同色棋子——第五个位置也同色/两侧没有不同色的棋子,返回true
    c.该位置(向左下)有4个同色棋子——第五个位置也同色/两侧没有不同色的棋子,返回true
    d.该位置(向右下)有4个同色棋子——第五个位置也同色/两侧没有不同色的棋子,返回true
    WA点不明……样例都能跑啊哭,然后我去看了一下题解,瞬间怀疑人生脑袋没了!

代码

  • AC版本
#include<cstdio>
#include<string.h>
using namespace std;

char color[2] = {'B', 'W'};

int main(){
    char op[4], ans;
    int sum;
    while(scanf("%s", op)!=EOF){
        sum = 0;
        while(strcmp(op, "END")!=0){
            ans = color[sum%2];
            sum++;
            scanf("%s", op);
        }
        printf("%c %d\n", ans, sum);
    }
	return 0;
}
  • WA版(哪天闲着没事干再改改)
#include<cstdio>
#include<string.h>
using namespace std;

char fir[31][31];
char color[2] = {'B', 'W'};

bool fun(int i, int j){
    char flag = fir[i][j];
    if(fir[i][j+1]==flag && fir[i][j+2]==flag && fir[i][j+3]==flag){
        if((fir[i][j+4]==flag) || (fir[i][j-1]=='0' && fir[i][j+4]=='0'))
            return true;
    }else if(fir[i-1][j]==flag && fir[i-2][j]==flag && fir[i-3][j]==flag){
        if((fir[i-4][j]==flag) || (fir[i+1][j]=='0' && fir[i-4][j]=='0'))
            return true;
    }else if(fir[i-1][j+1]==flag && fir[i-2][j+2]==flag && fir[i-3][j+3]==flag){
        if((fir[i-4][j+4]==flag) || (fir[i+1][j-1]=='0' && fir[i-4][j+4]=='0'))
            return true;
    }else if(fir[i-1][j-1]==flag && fir[i-2][j-2]==flag && fir[i-3][j-3]==flag){
        if((fir[i-4][j-4]==flag) || (fir[i+1][j+1]=='0' && fir[i-4][j-4]=='0'))
            return true;
    }else
        return false;
}

int main(){
    char op[4], ans;
    int sum;
    while(scanf("%s", op)!=EOF){
        memset(fir, '.', sizeof(fir));
        sum = 0;
        ans = '.';
        while(strcmp(op, "END")!=0){
            fir[op[1]-'1'+5][op[0]-'A'+5] = color[sum%2];
            sum++;
            scanf("%s", op);
        }
        for(int i=30; i>=0; i--){
            for(int j=0; j<=30; j++){
                if(fun(i, j) && fir[i][j]!='.'){
                    ans = fir[i][j];
                    break;
                }
            }
            if(ans!='.')
                break;
        }
        printf("%c %d\n", ans, sum);
    }
	return 0;
}
发布了46 篇原创文章 · 获赞 0 · 访问量 461

猜你喜欢

转载自blog.csdn.net/qq_44531167/article/details/105519221