当前位置: 代码迷 >> 综合 >> 【紫书】蛇形填数P40+nyoj33蛇形填数(原题)+ hdu2153仙人球的残影(变形蛇形填数) +nyoj852蛇形填数(二)
  详细解决方案

【紫书】蛇形填数P40+nyoj33蛇形填数(原题)+ hdu2153仙人球的残影(变形蛇形填数) +nyoj852蛇形填数(二)

热度:11   发布时间:2023-11-01 07:50:09.0

对矩阵进行填数:

10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4

输入n,代表矩阵的大小为n*n,然后输入该方阵。

从数1开始填写,设 ”笔“的坐标为( x ,y ),则一开始 x=0,y=n-1。笔的移动情况就是:下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。总之就是先下,到不能下为止,然后是左,接着是上,最后是右。

”不能填“指的是再走就走出边界(例如:4→5),或者这个各自已经做到过(例如:12→13)。如果把所有格子都初始化为0,就能够很好的判断。

#include <bits/stdc++.h>
using namespace std;
int a[20][20];
int main()
{int n,tot;cin>>n;int x=0,y=n-1;memset(a,0,sizeof(a));tot=a[0][n-1]=1;while(tot<n*n){while(x+1<n&&!a[x+1][y])//向下走a[++x][y]=++tot;while(y-1>=0&&!a[x][y-1])//向左走a[x][--y]=++tot;while(x-1>=0&&!a[x-1][y])//向上走a[--x][y]=++tot;while(y+1<n&&!a[x][y+1])//向右走a[x][++y]=++tot;}for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout<<setw(3)<<a[i][j];}cout<<endl;}
}


题目推荐:

nyoj33蛇形填数(原题)

hdu2153仙人球的残影(变形蛇形填数)

nyoj852蛇形填数(二)

//hdu2153仙人球的残影
#include<bits/stdc++.h>
using namespace std;
int a[101][101];
void Show(int x)
{int i,j,m,n;memset(a,0,sizeof(a));i=1;m=1;j=2;n=x;while(i<=n) a[1][i++]=m++;while(j<=n) a[j++][n]=m++;i=n-1;while(i>=1) a[n][i--]=m++;j=n-1;while(j>=2) a[j--][1]=m++;for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(a[i][j])printf("%3d",a[i][j]);elseprintf("   ");cout<<endl;}
}int main()
{int n;while(cin>>n&&n!=0){Show(n);}return 0;
}

//nyoj852蛇形填数(2)
#include <bits/stdc++.h>
using namespace std;
int a[1005][1005];
int main()
{int t;cin>>t;while(t--){memset(a,0,sizeof(a));int n;cin>>n;int x=0,y=0,tot;tot=a[x][y]=1;while(tot<(n+1)*n/2){while(y+1<n&&!a[x][y+1])//向右a[x][++y]=++tot;while(y-1>=0&&x+1<n&&!a[x+1][y-1])//向左下a[++x][--y]=++tot;while(x-1>=0&&!a[x-1][y])//向上a[--x][y]=++tot;}for(int i=0;i<n;i++){for(int j=0;j+i<n;j++){if(j)cout<<' ';cout<<a[i][j];}cout<<endl;}}
}