HRBUST 1564スパイラルマトリクスDFS

5539 ワード

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; } }