牛课网比赛16赛后总结

     晚上七点准时开始牛课网比赛,一看A题“字典序最大的子序列”,刚开始就理解错题干了,以为是要求最长上升子序列的,以为理解题干后就开是用动规做,画表,找状态,想了一会后看了一下样例,感觉不对劲,又重新理解了一下题干,发现我理解错了,随即转换思路想其他算法,定义了一个指针p指向我要存数的数组,想着对p按字典序从大到小排序,而不改变原数组内的值,哎,错就错在这,把指针最重要的性质给忘了,改变指针中数据的同时,也把原数组给改变了,害的我改了一个多小时的程序,起初我还以为是map容器会自动排序呢,临比赛结束的时候才发觉是指针着出错了,还好不是省赛,不然真要凉...............

    这次比赛犯得错误:1在没有完全理解题干的情况下开始想算法

                                 2指针的性质遗忘

   不过这次比赛还好没有一直死扣A题,一个多小时不知道怎么解,就换了下一道题,不知道这种做法是对还是不对?

  这次只A了一道C题,能力有待提高~~~~~~

https://www.nowcoder.com/acm/contest/84#question

 这道题只需要找不能通过题干要求连到一块的点的个数即可,最终答案便是这种点的个数-1;

#include<iostream>
using namespace std;


struct Dot
{
    int x,y;
}dot[101];
int n;
int visited[1001][1001];
int flag;


void dfs(int xi,int yi,int d)//d是用来判读由这个点是沿x方向遍历,还是沿y方向遍历,d为0是沿x方向,d为1时沿y方向,d为2时说明这个点是起始点,x,y方向都需要遍历
{
    int i,j;


    if(d==2||d==0)
    {
       for(i=1;i<1000;i++)
       {
           int xr=xi+i;//从此点往右走
           if(xr>1000)//判断是否可以往右走
            break;
           if(visited[xr][yi]==1)
           {
               visited[xr][yi]=2;//当某一点被便利后,用把visited赋值为2来记录
                dfs(xr,yi,1);
           }


       }
       for(i=1;i<1000;i++)
       {
           int xl=xi-i;//从此点往左走
           if(xl<1)    //判断是否可以往左走
            break;
           if(visited[xl][yi]==1)
           {
               visited[xl][yi]=2;
               dfs(xl,yi,1);
           }


       }
    }
    if(d==2||d==1)
    {
        for(i=1;i<1000;i++)
        {
            int yu=yi+i;//从此点往上走
            if(yu>1000)//判断是否可以往上走
                break;
            if(visited[xi][yu]==1)
            {
                visited[xi][yu]=2;
                dfs(xi,yu,0);
            }


        }
        for(i=1;i<1000;i++)
        {
            int yd=yi-i;//从此点往下走
            if(yd<1)//判断是否可以往下走
                break;
            if(visited[xi][yd]==1)
            {
                visited[xi][yd]=2;
                dfs(xi,yd,0);
            }
        }
    }
}


int main()
{
    int i;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>dot[i].x>>dot[i].y;
        visited[dot[i].x][dot[i].y]=1;//记录点的位置,用1存到visited中
    }


    flag=0;
    for(i=0;i<n;i++)
    {
        if(visited[dot[i].x][dot[i].y]==2)//判断此点是否已被遍历过
               continue;
        visited[dot[i].x][dot[i].y]=2;
        dfs(dot[i].x,dot[i].y,2);
        flag++;
    }
    cout<<flag-1<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/violet_ljp/article/details/80114580