1 条题解

  • 1
    @ 2025-3-14 20:04:06

    made in china

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    const int M=21;
    int l[5]={0,-1,0,1,0};
    int r[5]={0,0,1,0,-1};
    int a[M][M],b[M*M][3];// 螺旋矩阵的值、各值的坐标
    int  c[M*M],n,k; //c记录“王”棋子遍历的轨迹
    bool d[M*M],flag=false; //记录矩阵中各个位置是否遍历
    
    void dfs(int t,int x1, int y1) 
    //从第t步开始,当前位置在(x1,y1)时的遍历路径
    {
      int  i,x,y;
      if (flag) return;
      if (t>n*n)
      {
          cout<<c[1];
          for (i=2; i<=n*n; i++) cout<<' '<<c[i];
          cout<<endl;
          flag=true; return;
      }
      for (i=1; i<=4; i++)
      {
        x=x1+l[i];  y=y1+r[i];
        if ((x>=1)&&(x<=n)&&(y>=1)&&(y<=n)&&(d[a[x][y]]))
        {
          d[a[x][y]]=!d[a[x][y]];
          c[t]=a[x][y];
          dfs(t+1,x,y);
          c[t]=0;
          d[a[x][y]]=!d[a[x][y]];
        }
      }
    }
    
    void out2()  //处理奇数情况,根据情况搜索
    {
      memset(c,0,sizeof(c));
      memset(d,true,sizeof(d));
      if ((b[k][1]+b[k][2])%2==1) cout<<"No Path"<<endl;
      else
      {
        c[1]=k;
        d[k]=!d[k];
        dfs(2,b[k][1],b[k][2]);
      }
    }
    
    void out1()
    //处理n为偶数情况,按上图所示的方式产生回路
    {
      int d[M*M],x,y,i,t,f,p,z;
      for (i=1; i<=n; i++) d[i]=i;
      t=n*n/2+1;
      for (i=n; i>=1; i--)
      {
        d[t]=a[1][i]; t++;
      }
      t=n+1; z=n*n/2; x=n-1;  y=n;  f=-1;
      while (t<=z)
      {
        d[t]=a[x][y]; t++;
        if ((f==-1)&&(y>n/2+1)) y--;
        else if ((f==-1)&&(y==n/2+1)) {x--; f=1;}
        else if ((f==1) &&(y<n)) y++;
        else { f=-1; x--; }
      }
      t=n*n/2+n+1;  f=1; x=2;  y=1;
      while (t<=n*n)
      {
        d[t]=a[x][y]; t++;
        if ((f==1)&&(y<n/2)) y++;
        else if ((f==1)&&(y==n/2)) {f=-1; x++;}
        else if ((f==-1)&&(y>1)) y--;
        else { f=1;  x++;}
      }
      p=1;
      while (d[p]!=k) p++;
      for (i=p; i<=n*n; i++) cout<<d[i]<<' ';
      for (i=1; i<p; i++)
        if (i!=(p-1)) cout<<d[i]<<' ';
        else  cout<<d[p-1]<<endl;
    }
    
    void jz()
    {
      int i,j,x,y,z,t,f;
      x=n;  y=1;  t=1;  f=1;  z=n*n;
      while (t<=z)
      {
        a[x][y]=t; b[t][1]=x; b[t][2]=y;
        t++;
        if ((f==1)&&(y<n)&&(a[x][y+1]==0)) y++;
        else if ((f==1)&&((y==n)||(a[x][y+1]>0))){f=2; x--;}
        else if ((f==2)&&(x>1)&&(a[x-1][y]==0)) x--;
        else if ((f==2)&&((x==1)||(a[x-1][y]>0))) {f=3; y--;}
        else if ((f==3)&&(y>1)&&(a[x][y-1]==0)) y--;
        else if ((f==3)&&((y==1)||(a[x][y-1]>0))) {f=4; x++;}
        else if ((f==4)&&(x<n)&&(a[x+1][y]==0)) x++;
        else { f=1; y++;}
      }
      for (i=1; i<=n; i++)
      {
        for (j=1; j<=n; j++)  printf("%4d",a[i][j]);
        printf("\n");
      }
    }
    
    int main()
    {
      cin>>n>>k;  jz();
      if (n%2==0) out1();
      else out2();
      fclose(stdin); fclose(stdout);
      return 0;
    }
    
    
    • 1

    信息

    ID
    1527
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者