HRBUST 1564スパイラルマトリクスDFS
HRBUST 1564スパイラルマトリクスDFS
ここの1大神の本題をクリックして解きます
スパイラルマトリクスTime Limit:1000 MS Memory Limit:10240 K Total Submit:282(78 users)Total Accepted:81(72 users)Rating:Special Judge:No Description所定の数nに対してn*nのスパイラルマトリクスを印刷します.
例えばn=3の場合、出力:
1 2 3 8 9 4 7 6 5
Inputは複数組のテストデータで、各テストデータは1つの整数n(1<=n<=32)Outputを含んで各組のテストデータに対して、1つのn*nの螺旋行列を出力して、テーマの説明の中で定義します.
1組のテストデータでは、各数が占める文字幅は、3*3の螺旋行列のような、そのグループのデータの中で最大の数に1を加え、最大値は9であり、各数は2文字幅を占めなければならない.
2つのテストデータのセットは、空の行で区切られています.
Sample Input 1 2 3 Sample Output 1
1 2 4 3
1 2 3 8 9 4 7 6 5
本題で私が使っているのは、検索の方向制御が簡単であることです.fx[4]とfy[4]で方向を制御することです.
void dfs(int x,int y,int ii)
{
int xx,yy;
for(int i=ii;i<4+ii;i++)
{
xx=x+fx[i%4];
yy=y+fy[i%4];
if(xx>0&&yy>0&&xx<=n&&yy<=n&&a[xx][yy]==0)
{
a[xx][yy]=num++;
// printf("%d %d -%d
",xx,yy,a[xx][yy]);
dfs(xx,yy,i%4);
num--;
}
}
}
この問題は非常に簡単で、PEは主に以下の2点からなる.2つのデータの中央にあるスペース.(これは簡単ですが、問題を読みますね.ブロガーは見ていないのでPEを何度もします).図内の最大数は数ビット図内のすべての数が数+1ビットを占めている(これではスペースの干渉はないと考えられる)制御データのビット数についてこのように表すことができる
printf("%*d",length+1,a[i][j]); // * length +1
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stdio.h>
#include <queue>
#include <string.h>
#include <algorithm>
using namespace std;
int n,num;
int a[34][34];
int fx[4]={0,1,0,-1};
int fy[4]={1,0,-1,0};
void dfs(int x,int y,int ii)
{
int xx,yy;
for(int i=ii;i<4+ii;i++)
{
xx=x+fx[i%4];
yy=y+fy[i%4];
if(xx>0&&yy>0&&xx<=n&&yy<=n&&a[xx][yy]==0)
{
a[xx][yy]=num++;
// printf("%d %d -%d
",xx,yy,a[xx][yy]);
dfs(xx,yy,i%4);
num--;
}
}
}
int main()
{
int flag=0;
while(~scanf("%d",&n))
{
if(flag==1) {printf("
");}
memset(a,0,sizeof(a));
num=2;
int length=1,m=n*n;
while(m>=10)
{
length++;
m/=10;
}
for(int i=0;i<=n+1;i++)
{
a[0][i]=999;
a[i][0]=999;
a[i][n+1]=999;
a[n+1][i]=999;
}
a[1][1]=1;
dfs(1,1,0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%*d",length+1,a[i][j]);
}
printf("
");
}
flag=1;
}
}