| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 840 人关注过本帖
标题:拉丁正方形
只看楼主 加入收藏
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
这个题目的重点是算法

★★★★★为人民服务★★★★★
2012-11-22 20:37
youngdavid
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:698
注 册:2012-9-24
收藏
得分:2 
程序代码:
  for(m=2,n=1;m<=l,n<=l;n++)
    {
        for(i=1,j=1;i<m;j++)
        {
            for(;p<p+l;p++)//这一句永远成立,所以p会一直加,直到越界
            {
                if(*p!=s[i][j])
                {
                    s[m][n]=*p;
                }
            }
            if(j==l)
            {
                i++;
            }
        }
        m++;
    }
2012-11-23 07:53
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:16 
这题要用到递归搜索,依次搜索每个格子是什么,然后看是否符合规则,用一个hash表记录每一行每一列之前有过哪些

我写了一个,能算出结果,但是对于n=7运算速度太慢,所有还有一些优化需要加,这个楼主自己考虑吧,如果你还没学过搜索的话,= = = =

程序代码:
#include <stdio.h>
#define N 7

int row[7],col[7],n,ans;

void dfs(int h,int l)
{
     if (h==n-1)
     {
                int p=0,i,j;
                for (i=0; i<n; i++)
                {
                    for (j=0; j<n; j++)
                      if ((col[i]&(1<<j))==0) break;
                    if ((p&(1<<j))!=0) return;
                    p|=(1<<j);
                }
                ans++;
                return;
     }
     
     int i;
     for (i=0; i<n; i++)
     if ((row[h]&(1<<i))==0 && (col[l]&(1<<i))==0)
     {
                            row[h]|=(1<<i); col[l]|=(1<<i);
                            if (l==n-1) dfs(h+1,0); else dfs(h,l+1);
                            row[h]^=(1<<i); col[l]^=(1<<i);
     }
}

void calc()
{
    int i; 
    ans=0;
    memset(row,0,sizeof(row));
    memset(col,0,sizeof(col));
    for (i=0; i<n; i++) row[0]+=(1<<i);
    for (i=0; i<n; i++) col[i]+=(1<<i);
    
    dfs(1,0);
}

int main()
{
    scanf("%d",&n);
    calc();
    printf("%d\n",ans);
    
    system("pause");
}
2012-11-23 12:31
fuyikai7
Rank: 2
等 级:论坛游民
帖 子:15
专家分:18
注 册:2012-11-22
收藏
得分:0 
看着看着发现我那个循环的确不能用 搜索的确没学过。。。 看着你这个学喽。。。问一下 1<<j 1<<i p|=(1<<j)是什么意思 别的应该都还看得懂


[ 本帖最后由 fuyikai7 于 2012-11-23 13:12 编辑 ]
2012-11-23 12:37
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 14楼 fuyikai7
哈希表的写法,比如n=5,我这里假设是在0-4行,0-4列 分别插入0-4,(方便处理,没影响),row[i]表示第i行放入过哪些数,怎么表示呢? 把row[i]化成2进制,比如row[i]=5=00101,表示第i行0和2都不能放了,当然这里你也可以用二维数组row[n][n]表示一样的,至于|,&这些是二进制的位运算

同时这题要做完整的话这些还不够的,由于速度问题还需要优化
2012-11-23 13:29
fuyikai7
Rank: 2
等 级:论坛游民
帖 子:15
专家分:18
注 册:2012-11-22
收藏
得分:0 
原理懂了 但二进制位运算果然蛋疼 自己写现在肯定搞不出来。。
2012-11-23 16:53
快速回复:拉丁正方形
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017264 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved