/ CUOJ / 题库 /

棋盘对峙

棋盘对峙

暂无测试数据。

题目描述

max和min很喜欢下棋,今天他们要在n×m的棋盘上对峙,他们轮流下棋,最后棋子多的人赢。棋盘上有一些墙,他们不能通过,max优先下棋。
顺序:下左上右。输出赢的人,平局输出‘draw’。

输入格式

第一行,m,n;
第二~n+1行,棋盘,#是墙,.是路。
第n+2行,max和min的初始位置。

输出格式

输出赢的人,并输出棋盘上的情况,2->max,1->min,墙输出#,没访问过输出0。若初始值越界则什么都不输出。

提示说明

对于30%的数据,1<=n,m<=3;

对于60的数据,1<=n,m<=5;

对于100%的数据,1<=n,m<=7;

参考代码:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int visited[10][10],n,m,yd[4][2] = {{-1,0},{0,-1},{1,0},{0,1}},sx1,sy1,sx2,sy2,mmx,mmn;
char a[10][10];
queue<int>x,y,mxmn;

int main() {
    cin>>m>>n;
    for(int i = 1; i <= n; i++) {
        scanf("%s",a[i] + 1);
    }
    cin>>sx1>>sy1>>sx2>>sy2;
    if(sx1 <= 0 || sy1 <= 0 || sx2 <= 0 || sy2 <= 0) return 0;
    x.push(sx1),y.push(sy1),mxmn.push(2);
    x.push(sx2),y.push(sy2),mxmn.push(1);
    visited[sx1][sy1] = 2;
    visited[sx2][sy2] = 1;
    while(!(x.empty() && y.empty() && mxmn.empty())) {
        int nx = x.front(),ny = y.front(),nm = mxmn.front();
        x.pop(),y.pop(),mxmn.pop();
        for(int i = 0; i < 4; i++) {
            int tx = nx + yd[i][0],ty = ny + yd[i][1];
            if(tx > 0 && ty > 0 && tx <= n && ty <= m) {
                if(visited[tx][ty] == 0 && a[tx][ty] == '.') {
                    visited[tx][ty] = nm;
                    x.push(tx),y.push(ty),mxmn.push(nm);
                    if(nm == 2) mmx++;
                    else if(nm == 1) mmn++;
                }
            }
        }
    }
    if(mmx == mmn) cout<<"draw"<<endl;
    else if(mmx > mmn) cout<<"max"<<endl;
    else if(mmx < mmn) cout<<"min"<<endl;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            if(a[i][j] == '#') {
                cout<<"#";
            }
            else cout<<visited[i][j];
        }
        cout<<endl;
    }
}