看题目:
评测用例规模与约定 所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。
首先看到这道题,我用BFS的算法写的,但是由于某些原因导致bfs只得了60分,
于是改为了dfs后,它成功了。
过程分析:BFS这段代码冗长,而且在while循环中,应该再加一个条件判断,
不然它会从之前判断那些点,走到地图的角落又往回走,这点很不美好。还有一个
更不美好的,数组开太多了,正常情况下,能用单一变量解决的坚决不用数组,因为
容易超出数组范围,所以开数组时,根据实际情况开大点点。
然后是dfs,因为dfs会遍历地图的每个点,直至终点,这恰好符合了我需要
实现填充这一功能,即是从起点出发,把每一个能够到达的点染成和起始点
一样的颜色。
而判断合法的条件就是不撞到边界,不超出范围。针对本题而言,你可以直接
定义一个bool函数判断合法,用它替代if语句中那一大堆,使代码具有可读性
bool judge(){
if(tx>=0 && ty>=0 && tx<m && ty<n && vis[tx][ty]==0 &&
asc[tx][ty] != '+' && asc[tx][ty] != '|' && asc[tx][ty] != '-')
return true;
else return false;
}
然后dfs的条件就是if(judge)
首先我们来看看60分的代码,为什么60分我也不知道,WA了?反正这个BFS使人难受:
#include<iostream>
#include<queue>
#include<math.h>
#include<string.h>
using namespace std;
int m,n,q;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
//right,up,left,down
int vis[100][100];
char asc[100][100];
int op[100];//actions
int locate[100][4];
char filled[100];
struct point{
int x,y;
};//asc[i][j]
queue<point> Q;
void full(int sx,int sy,char tag){
memset(vis,0,sizeof(vis));
point start;point to;
start.x=sx;start.y=sy;
Q.push(start);
vis[sx][sy]=1;
asc[sx][sy]=tag;
while(!Q.empty()){
point now=Q.front();
Q.pop();
for(int mi=0;mi<4;mi++){
to.x=now.x+dir[mi][0];
to.y=now.y+dir[mi][1];
//suit for
if(to.x>=0 && to.y>=0 && to.x<=m && to.y<=n && vis[to.x][to.y]==0 &&
asc[to.x][to.y] != '+' && asc[to.x][to.y] != '-' && asc[to.x][to.y] != '|'){
asc[to.x][to.y]=tag;
vis[to.x][to.y]=1;
Q.push(to);
}
}
}
}
void wall(int x1,int y1,int x2,int y2){
if(x1 == x2 && abs(y2-y1) >= 2){
asc[x1][y1]='+';asc[x2][y2]='+';
if(y1>y2)
for(int mj=y2+1;mj<y1;mj++)
asc[x1][mj]='|';
if(y2>y1)
for(int mj=y1+1;mj<y2;mj++)
asc[x1][mj]='|';
}
if(y1==y2 && abs(x1-x2) >= 2 ){
asc[x1][y1]='+';asc[x2][y2]='+';
if(x2>x1)
for(int mj=x1+1;mj<x2;mj++)
asc[mj][y1]='-';
if(x1>x2)
for(int mj=x2+1;mj<x1;mj++)
asc[mj][y1]='-';
}
if(x1==x2 && abs(y2-y1)<2){
asc[x1][y1]='|';asc[x2][y2]='|';
}
if(y1==y2 && abs(x1-x2)<2){
asc[x1][y1]='-';asc[x2][y2]='-';
}
}
void draw(){
for(int i=0;i<q;i++){
cin>>op[i];
if(op[i]==1){//filled
cin>>locate[i][0]>>locate[i][1];
cin>>filled[i];
full(locate[i][0],locate[i][1],filled[i]);
}
else{
cin>>locate[i][0]>>locate[i][1]>>locate[i][2]>>locate[i][3];
//x1,y1 x2,y2
wall(locate[i][0],locate[i][1],locate[i][2],locate[i][3]);
}
}
}
int main(){
//memset(vis,0,sizeof(vis));
//initialize
cin>>m>>n>>q;
for(int i=n-1;i>=0;i--)
for(int j=0;j<m;j++)
asc[j][i]='.';
draw();
for(int i=n-1;i>=0;i--){
for(int j=0;j<m;j++)
cout<<asc[j][i];
cout<<endl;
}
return 0;
}
我先把测试数据放上来
输入:
16 13 9
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4 2 C
输出:
................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................
输入
4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A
输出:
AAAA
A--A
输入:
100 100 15
0 1 1 98 1
0 98 1 98 98
0 98 98 1 98
0 1 98 1 1
0 5 5 94 5
0 94 5 94 94
0 94 94 5 94
0 5 94 5 5
0 37 37 62 37
0 62 37 62 62
0 62 62 37 62
0 37 62 37 37
1 40 41 *
1 2 2 S
1 6 6 ?
输出:
....................................................................................................
.+------------------------------------------------------------------------------------------------+.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSS+----------------------------------------------------------------------------------------+SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|???????????????????????????????+------------------------+???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????+------------------------+???????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS+----------------------------------------------------------------------------------------+SSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.+------------------------------------------------------------------------------------------------+.
....................................................................................................
思考,到底哪里出错了呢?是不是超时了呢?
伤悲悲伤。可能是我填充函数复杂度的问题,下面我尝试用DFS写一份代码,阔怕。DFS神奇地过了,开心
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int m,n,q,op,x,y,xx,yy;
char ful;
int vis[101][101];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
char asc[101][101];
void dfs(int sx,int sy,char tag){
vis[sx][sy]=1;
asc[sx][sy]=tag;
for(int mi=0;mi<4;mi++){
int tx=sx+dx[mi];
int ty=sy+dy[mi];
if(tx>=0 && ty>=0 && tx<m && ty<n && vis[tx][ty]==0 && asc[tx][ty] != '+' && asc[tx][ty] != '|' && asc[tx][ty] != '-')
dfs(tx,ty,tag);
}
}
void swap(int *xxx,int *yyy){
int temp=*xxx;
*xxx=*yyy;
*yyy=temp;
}
void draw(){
for(int hi=0;hi<q;hi++){
scanf("%d",&op);
if(op==1){
scanf("%d %d %c",&x,&y,&ful);
memset(vis,0,sizeof(vis));
dfs(x,y,ful);
}
else if(op==0){
scanf("%d %d %d %d",&x,&y,&xx,&yy);
if(x==xx){
if(y>yy) swap(y,yy);
for(int j=y;j<=yy;j++){
if(asc[x][j]=='-' || asc[x][j]=='+')
asc[x][j]='+';
else asc[x][j]='|';
}
}
else if(y==yy){
if(x>xx) swap(x,xx);
for(int j=x;j<=xx;j++){
if(asc[j][y]=='|' || asc[j][y]=='+')
asc[j][y]='+';
else asc[j][y]='-';
}
}
}
}
}
int main(){
scanf("%d %d %d",&m,&n,&q);
for(int i=n-1;i>=0;i--)
for(int j=0;j<m;j++)
asc[j][i]='.';
draw();
for(int i=n-1;i>=0;i--){
for(int j=0;j<m;j++)
cout<<asc[j][i];
if(i!=0)
cout<<endl;
}
return 0;
}