| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 652 人关注过本帖
标题:四皇后问题,在一个 4x4 的矩阵里找四个人填满,要求行和列还有对角都不能有 ...
只看楼主 加入收藏
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
结帖率:81.82%
收藏
已结贴  问题点数:10 回复次数:8 
四皇后问题,在一个 4x4 的矩阵里找四个人填满,要求行和列还有对角都不能有人重复,为什么代码没报错但就是输不出东西呀
程序代码:
#include<stdio.h>
int panduan(int(*a)[4],int i,int j)
{
    int m,n;
    for(m=0,n=j;m<4;m++)
    {
        if(a[m][n]==1&&m!=i) return 0;
    }//判断这一列是否可走
    for(m=i,n=0;n<4;n++)
    {
        if(a[m][n]==1&&n!=j) return 0;
    }//判断这一行是否可走
    for(m=i-1,n=j-1;m>=0&&n>=0;m--,n--)
    {
        if(a[m][n]==1) return 0;
    }//判断左上方是否可走
    for(m=i+1,n=j+1;m<4&&n<4;m++,n++)
    {
        if(a[m][n]==1) return 0;
    }//判断右下方是否可走
    for(m=i+1,n=j-1;m<4&&n>=0;m++,n--)
    {
        if(a[m][n]==1) return 0;
    }//判断右上方是否可走
    for(m=i-1,n=j+1;m>=0&&n<4;m--,n++)
    {
        if(a[m][n]==1) return 0;
    }//判断是否可右下方走
    return 1;
}//panduan函数判断下一步的未知是否符合
int huanghou(int(*a)[4],int q)
{
    int count=0,i=0,j,t,flag;
    for(j=0;j<q;)
    {

        flag=0;
        for(;i<q;)
      {
        if(panduan(a,i,j))
        {
            t=i;i=0;a[t][j]=1;
            j=j+1;flag=1;break;
        }
      }//变量t用来记录前一步行的信息,如富哦判断合法就走下一步,下一步的开始从行为零搜索;
        if(flag==0)
        {
            j=j-1;a[t][j]=0;
            i=t;i=i+1;
        }//如果行搜索完没有合适的就退回前一步,从前一步的下一行开始搜索;
        else continue;
    }
      if(j==4)

      {
         for(i=0;i<4;i++)
         {

             for(j=0;j<4;j++)
             printf("    %d   ",a[i][j]);
            printf("\n");
         } count++;
      }//如果四列都填完了 者找到一组解输出这一组解
      return count;
}
void main()
{
    int a[4][4],n=4,i,j;int count=0;
    for(i=0;i<4;i++)
            for(j=0;j<4;j++)
               a[i][j]=0;
    count=huanghou(a,n);
    printf(" count=%d",count);
}
2014-09-16 19:43
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
你的思路我没看懂!

注释多点该多好!


[fly]存在即是合理[/fly]
2014-09-16 20:02
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:10 
简单说说:你可以用步骤调试法,在某一个可疑的步骤上输出当前变量的值,如果死循环它就会不停输出,如果停下来啦,就去它下面找错误

    for(;i<q;)
      {
        if(panduan(a,i,j))
        {
            t=i;i=0;a[t][j]=1;
            j=j+1;flag=1;break;
        }
      }
        //变量t用来记录前一步行的信息,如富哦判断合法就走下一步,下一步的开始从行为零搜索;
你这段话肯定有问题 我跟随了一下,发现i一直是0,q一直是4  陷入了死循环
2014-09-16 21:10
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 2 楼 azzbcc
思路是这样的,将矩阵分成四列,先放置第一列,从第一列的第一行开始放置,如果放置的位子行列和对角都没有人,者在这个位置置1,然后再从第二列的第一行搜索,一直搜索到第四行,如果满足就置1,如果这列的四行都不满足,就退回到前一列放置的位置,把它置0,然后从这个位子的下一行开始搜索;
2014-09-16 21:11
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 3 楼 erty1001
你说的我单步调试过,程序应该进入panduan()这个函数,第一步肯定会满足的,返回值是1,执行if语句,然后i的值就会增加了,但是我调试时,发现panduan()是0,没有执行if语句,我检查了panduan()函数没有错呀,不知道为什么函数值返回值是0?
2014-09-16 21:20
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 3 楼 erty1001
太感谢了  
2014-09-16 21:41
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 3 楼 erty1001
后面加一个else i++ 也不行呀;

2014-09-17 09:34
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 3 楼 erty1001
解决了  t 只能记录前一步的位置  以后的位置记不住了  错在这里   修改一下  t就行了  谢谢你

2014-09-17 11:49
嗒嗒嗒
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-9-24
收藏
得分:0 
回复 8楼 风车转风车89
t要怎么改?????????
2015-09-24 18:33
快速回复:四皇后问题,在一个 4x4 的矩阵里找四个人填满,要求行和列还有对角都 ...
数据加载中...
 
   



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

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