C - Red and Black

这道题可以这么说,第一次编写好的代码和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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值