NKOJ_1437 校长杯 赛事安排

本题我的基本思路是先固定第一行和第一列,从2,2,开始更新。只要保证本列和本行纹出现过就行,而且还要从小到大访问

#include<stdio.h>

#include<math.h>

int a[600][600];

int main()

{

    int k,n,max;

    int i,j,x,xx,y,yy,flat,f;

    while(scanf("%d",&n)!=EOF)

    {

        max=(int)pow(2,n);

        x=2;

        y=2;

        for(i=1;i<=max;++i)

        {

            a[1][i]=i;

            a[i][1]=i;

        //    a[i][i]=1;

        }

        for(i=2;i<=max;++i)

        {

            for(j=2;j<=max;++j)

            {

                for(f=1;f<=max;++f)

                {

                    flat=1;

                    for(xx=1;xx<i;++xx)

                    {

                        if(a[xx][j]==f)

                        {

                            flat=0;

                            break;

                        }

                    }

                    if(flat==1)

                    {

                        for(yy=1;yy<j;++yy)

                        {

                            if(a[i][yy]==f)

                            {

                                flat=0;

                                break;

                            }

                        }

                    }

                    if(flat==1)

                    {

                        a[i][j]=f;

                        break;

                    }

                }////fff

            }

            x=i;

        }////fff

        for(i=1;i<=max;++i)

        {

            for(j=1;j<=max;++j)

                printf("%d  ",a[i][j]);

            printf("\n");

        }

    }//while

    return 0;

}

 

你可能感兴趣的:(OJ)