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

 

posted @ 2012-08-21 08:23  煮人为乐  阅读(157)  评论(0编辑  收藏  举报