| 
 | 
 
 
 楼主 |
发表于 2021-12-5 16:37:18
|
显示全部楼层
 
 
 
这个是我提交到平台的代码  原注释已经无了  有看不懂的操作 我可以解释 
 
 
- #include"iostream"
 
  
- #include"vector"
 
 - #include"algorithm"
 
  
- using namespace std;
 
  
 
- typedef struct _POINT
 
 - {
 
 -         int i;
 
 -         int j;
 
 -         int isto;        //??????????????????????
 
 -         int mp;        //????????????,??????????????????????
 
 -         int temp;        //??????????
 
 -         struct _POINT* h;        //????????????
 
 -         struct _POINT* nh;        //????????????????
 
  
-         int p;        //??????????
 
  
 
- }POINT;
 
  
- int mymax = 0;        //????????????????????????????????????????,????????????????????????????????????????????????????????????????????????
 
 - void function1(int n, int x, int y);
 
 - int up(POINT** p, int x, int y, int n);
 
  
- void dfs(POINT** p, vector<POINT*> v, int n);
 
 - void dfs2(POINT** p, vector<POINT*> v, POINT* d, POINT* g, int n);
 
 - void setH(POINT* p);
 
  
 
 
 
- int main()
 
 - {
 
 -         int n, x, y;
 
 -         while(cin >> n >> x >> y)
 
 -         {
 
 -                 function1(n, x, y);
 
 -         }
 
 -         
 
 - }
 
  
 
- void function1(int n, int x, int y)
 
 - {
 
  
-         POINT** p;
 
  
-         int temp;
 
 -         int i, j;
 
 -         POINT* maxP;
 
  
 
-         x--;
 
 -         y--;
 
  
-         p = (POINT**)malloc(sizeof(POINT*) * n);
 
 -         p[0] = (POINT*)malloc(sizeof(POINT) * n * n);
 
  
-         for (i = 0; i < n; i++)
 
 -         {
 
 -                 p[i] = p[0] + i * n;
 
 -         }
 
  
-         //??????????????
 
 -         //??????????
 
 -         for (i = 0; i < n; i++)
 
 -         {
 
 -                 for (j = 0; j < n; j++)
 
 -                 {
 
 -                         cin >> temp;
 
 -                         p[i][j].p = temp;
 
 -                         p[i][j].isto = 0;        
 
 -                         p[i][j].i = i;
 
 -                         p[i][j].j = j;
 
 -                         p[i][j].mp = 0;
 
 -                         p[i][j].temp = 0;
 
 -                 }
 
 -         }
 
  
-         cout << up(p, x, y, n) << endl;
 
  
- }
 
  
- //????????
 
 - //??????????
 
 - int up(POINT **p, int x, int y, int n)
 
 - {
 
 -         vector<POINT*> v;
 
 -         POINT* g;
 
 -         POINT* d;
 
 -         int temp;
 
 -         POINT* maxP;
 
 -         int i, j;
 
 -         vector<POINT*> a;        //??????????
 
  
-         
 
  
-         v.push_back(&p[x][y]);
 
 -         temp = p[x][y].p;
 
 -         p[x][y].p = 0;
 
 -         p[x][y].h = NULL;
 
 -         p[x][y].nh = NULL;
 
  
-         a.push_back(&p[x][y]);
 
  
 
-         while (1)
 
 -         {
 
 -                 mymax = 0;
 
 -                 dfs(p, v, n);
 
 -                 maxP = &p[0][0];
 
 -                 for (i = 0; i < n; i++)
 
 -                 {
 
 -                         for (j = 0; j < n; j++)
 
 -                         {
 
 -                                 p[i][j].isto = 0;
 
 -                                 if (p[i][j].mp > maxP->mp)
 
 -                                 {
 
 -                                         maxP = &p[i][j];
 
 -                                 }
 
 -                         }
 
 -                 }
 
 -                 if (maxP->mp <= 0)
 
 -                 {
 
 -                         break;
 
 -                 }
 
 -                 temp += maxP->mp;
 
 -                 while (maxP->h)
 
 -                 {
 
 -                         maxP->mp = maxP->temp = maxP->p = 0;
 
  
-                         maxP = maxP->h;
 
  
-                 }
 
 -         }
 
 -         return temp;
 
 - }
 
  
 
- void dfs(POINT** p, vector<POINT*> v, int n)
 
 - {
 
 -         POINT* d, * g;
 
 -         int temp;
 
 -         g = v.back();
 
  
-         //????????
 
 -         if (g->i != 0)
 
 -         {
 
  
-                 d = &p[g->i - 1][g->j];
 
 -                 if (d->p)
 
 -                 {
 
 -                         dfs2(p, v, d, g, n);
 
 -                 }
 
 -                 
 
 -         }
 
  
-         //????
 
 -         if (g->j != 0)
 
 -         {
 
 -                 d = &p[g->i][g->j - 1];
 
 -                 if (d->p)
 
 -                 {
 
 -                         dfs2(p, v, d, g, n);
 
 -                 }
 
 -         }
 
  
-         //????
 
 -         if (g->i < n - 1)
 
 -         {
 
 -                 d = &p[g->i + 1][g->j];
 
 -                 if (d->p)
 
 -                 {
 
 -                         dfs2(p, v, d, g, n);
 
 -                 }
 
 -         }
 
  
-         //????
 
 -         if (g->j < n - 1)
 
 -         {
 
 -                 d = &p[g->i][g->j + 1];
 
 -                 if (d->p)
 
 -                 {
 
 -                         dfs2(p, v, d, g, n);
 
 -                 }
 
 -         }
 
 - }
 
 -         
 
  
 
- void dfs2(POINT** p, vector<POINT*> v, POINT* d, POINT *g, int n)
 
 - {
 
 -         int temp;
 
 -         if (find(v.begin(), v.end(), d) == v.end())
 
 -         {
 
 -                 //????????????
 
 -                 //??????????????????????????????????????????????????????????????????????????
 
 -                 temp = g->temp + d->p;
 
 -                 d->nh = g;
 
  
-                 if (!d->isto)
 
 -                 {
 
 -                         //???????????????????????????? ??????????????????????????
 
 -                         d->isto = 1;
 
 -                         d->mp = temp;
 
 -                         d->temp = temp;
 
 -                         d->h = g;
 
 -                 }
 
 -                 
 
 -                 else
 
 -                 {
 
 -                         //??????????????????????
 
 -                         //????????????????
 
 -                         d->temp = temp;
 
 -                         if (d->temp > d->mp)
 
 -                         {
 
 -                                 //??????????????????????????????????????????????????
 
 -                                 d->mp = d->temp;
 
 -                         }
 
 -                 }
 
  
-                 if (temp > mymax)
 
 -                 {
 
 -                         //??????????????????????
 
 -                         setH(d);
 
 -                         mymax = temp;
 
 -                         
 
 -                 }
 
 -                 v.push_back(d);
 
 -                 dfs(p, v, n);
 
 -         }
 
 - }
 
  
 
- //????????????????
 
 - void setH(POINT *p)
 
 - {
 
 -         while (p->nh)
 
 -         {
 
 -                 p->h = p->nh;
 
 -                 p = p->h;
 
 -         }
 
 -         return;
 
 - }
 
  复制代码 |   
 
 
 
 |