Codeforces 445 A DZY Loves Chessboard【DFS】

时间:2023-03-08 16:55:25

题意:给出n*m的棋盘,在‘.’处放上B或者W,最后要求所有的B和W都不相邻

先把棋盘的点转化成‘B’,再搜,如果它的四周存在‘B’,则将它变成'W'

一直挂在第五个数据的原因是,没有dfs(nx,ny)

搜索果断弱爆了= =(差不多写了一个小时)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=;
char g[][];
int n,m;
int dir[][]={-,,,,,,,-}; void dfs(int x,int y){
if(x<||x>n||y<||y>m||g[x][y]=='-') return;
if(g[x][y]=='B'){
for(int i=;i<;i++){
int nx=x+dir[i][];
int ny=y+dir[i][];
if(g[nx][ny]=='B') {
g[nx][ny]='W';
dfs(nx,ny);
}
}
}
if(g[x][y]=='W'){
for(int i=;i<;i++){
int nx=x+dir[i][];
int ny=y+dir[i][];
if(g[nx][ny]=='W') {
g[nx][ny]='B';
dfs(nx,ny);
}
}
}
} int main(){
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>g[i][j]; for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
if(g[i][j]=='.') g[i][j]='B';
} for(int i=;i<=n;i++)
for(int j=;j<=m;j++) dfs(i,j); for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
printf("%c",g[i][j]);
printf("\n");
}
return ;
}

后来翻别人的代码来看,发现不用搜索= =判断i+j为奇数,放上'B',否则放上'W'

真是too young---------

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; int main(){
int n,m;
char ch;
scanf("%d %d",&n,&m);
for(int i=;i<n;i++){
for(int j=;j<m;j++){
cin>>ch;
if(ch=='.'){
if((i+j)%) cout<<'B';
else cout<<'W';
}
else cout<<'-';
}
printf("\n");
}
return ;
}

加油啊,加油---go--go--go--