晚上七点准时开始牛课网比赛,一看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;
}