棋盘对峙
暂无测试数据。
题目描述
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;
}
}
信息
- ID
- 1002
- 难度
- 3
- 分类
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者