Codeforces Round #254 (Div. 2)
题目描述
Example
input
1 1
.
output
B
input
2 2
..
..
output
BW
WB
input
3 3
.-.
---
--.
output
B-B
---
--B
题意思路:黑白棋放入存在坏掉的(-)的棋盘中,黑白棋不相邻的摆放方式输出。想到了dfs,但是没写对。主要就是每一片(连在一个的“.”们)可以放棋的地方(.)是一起dfs到底,一片一片来的,而我想的是从左上角到右下角没有想到中间处理过程中遇到‘-’把两片区域隔开,该怎末过去,怎么继续判断是Black、还是White。还有就是dfs另外定义一个flag来改变颜色。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int res=0;
int n,m;
char a[105][105];
int vis[105][105];
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int flag)
{
if(flag==0)
a[x][y]='B';
else
a[x][y]='W';
for(int i=0; i<4; i++)
{
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(a[tx][ty]=='.')
{
if(a[x][y]=='B')
a[tx][ty]='W';
else
a[tx][ty]='B';
dfs(tx,ty,!flag);
}
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
getchar();
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
scanf("%c",&a[i][j]);
getchar();
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(a[i][j]=='.')
dfs(i,j,0);
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
printf("%c",a[i][j]);
printf("\n");
}
return 0;
}
这里还有一种方法。没有用dfs,找到了规律(利用行和列)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int res=0;
int n,m;
char a[105][105];
int main()
{
scanf("%d%d",&n,&m);
getchar();
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
scanf("%c",&a[i][j]);
getchar();
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(a[i][j]=='.')
{
if((i+j)%2==0)
a[i][j]='B';
else
a[i][j]='W';
}
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
printf("%c",a[i][j]);
printf("\n");
}
return 0;
}