这道题可以这么说,第一次编写好的代码和AC的代码,除了几个关键字没改过,剩下的全都改了个遍。问题多到记不全了,只能把重要的下来。下面的知识是跟很多前辈学的!
1:在输入数字后输入字符的情况下,应该在有个特殊的处理
方法一:
scanf("%d\n");
在%d后面加个\n就可以把数字后面的回车冲销掉,不会对后面将要输入的字符造成影响。
方法二:
scanf("%d");
getchar();
getchar();起到冲销数字后面回车的作用
2:BFS算法的Q.front(); 和Q.pop();一般挨着写
3:对矩阵中一个元素的几个方向遍历时,可以建立两个数组依次存入对应的方向
例子:6*9的矩阵data[6][10]中对坐标为(7,1)‘元素的上下左右进行遍历,看这四个元素中哪个为’@‘,如果为’@‘,输出“Yes!”并换行。
我写的顺序为:上-->右-->下-->左
代码:
int x[4] = {0,1,0,-1};
int y[4] = {1,0,-1,0};
for(int i = 0; i < 4; i++)
{
if(data[7 + x[i]][1 + y[i]] == '@')
printf("Yes!\n");
}
4:变量名不要和关键字或一些库函数名一样,比如count,写成Count就好啦!5:输入一个二维字符数组,不必一个一个的输入,用gets();函数,每次读取一行。
例子:输入一个20*20的字符矩阵。
char data[21][21];
for(int i = 0 ; i < 20; i++)
gets(data[i]);
下面是我这道题AC的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct vis
{
int x;
int y;
vis(int x_,int y_)
{
x = x_;
y = y_;
}
};
struct vis visit(0,0);
queue<vis> Q;
int x[4] = {0,1,0,-1};
int y[4] = {1,0,-1,0};
char data[21][21];
int flag[21][21];
int c,r,row,column,Count;
void BFS()
{
while(!Q.empty())
{
visit = Q.front();
Q.pop();
//cout << visit.x << ' ' << visit.y << endl;
for(int i = 0; i < 4; i++)
{
if((visit.x + x[i] >= 0 && visit.x + x[i] < r) && (visit.y + y[i] >= 0 && visit.y + y[i] < c))
if(data[visit.x + x[i]][visit.y + y[i]] != '#')
if(flag[visit.x + x[i]][visit.y + y[i]] == 0)
{
Count++;
Q.push(vis(visit.x + x[i],visit.y + y[i]));
flag[visit.x + x[i]][visit.y + y[i]] = 1;
}
}
}
cout << Count << endl;
}
int main()
{
while(cin >> c >> r)
{
getchar();
if(c == 0 && r == 0)
break;
else
{
memset(flag,0,sizeof(flag));
Count = 1;
for(int i = 0; i < r; i++)
{
gets(data[i]);
for(int j = 0; j < c; j++)
{
if(data[i][j] == '@')
{
row = i,column = j;
//cout << i << ' ' << j << endl;
}
}
}
flag[row][column] = 1;
Q.push(vis(row,column));
BFS();
}
}
return 0;
}
END