回 帖 发 新 帖 刷新版面

主题:求高人指点!谢谢!

0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0 
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0 
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0 
  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0 
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0 
  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0 
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0 
  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0
  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
16*16的矩阵,其中4,8,12,16行都是0,其他行只有一个1,一共12个1.
要求每行每列有且只有一个1(除了4,8,12,16行、列必须为0)。[color=FF0000][b]输出所有不同的矩阵。[/b][/color]//同学说可以建一个list,1-16个,将矩阵中1的位置坐标放在list中,分为行号和列号。 我还是不会做,
求高人解答,万分感谢!

回复列表 (共4个回复)

沙发

总比八皇后问题简单吧。。

板凳

思路:用一维数组,下标表示不同的行,数组值表示不同列的地方,如:a[1] = 1,表示1行1列;没有考虑中间都是零的情况,留给lz自己改吧。。代码如下:

[code=c]
#include <stdio.h>
#include <conio.h>
#define MAX 13

int main(int argc, char *argv[])
{
    
    int i ,k, j, a[MAX], flag;
    i = 1;
    a[i] = 1;    //设置初始值
    while(1)
    {
        flag = 1; //设置标志量
        for(k = i - 1; k > 0; k--)
        {
            if(a[i] == a[k])
            {
                flag = 0; //如果不同行的1 却在一列了flag = 0表明不满足条件;
            }
        }    
        
        if(flag == 1 && i == MAX - 1) //满足要求输出一组解
        {
            for(j = 1; j <= MAX -1 ;j++)
            {
                for(k = 1; k <= MAX - 1; k++)
                {
                    if(a[k] == j)
                    {
                        printf("%-4d", 1);
                    }
                    else
                    {
                        printf("%-4d", 0);
                    }
                }
                putchar('\n');
            }
            puts("---------------------------------------------");
            getch();
        }
        
        if(flag == 1 && i < MAX - 1) //如果条件满足但解数未满,继续往前试解
        {
            i++;
            a[i] = 1;
            continue;
        }    
        
        while(a[i] == MAX - 1 && i > 1) //a[i] == MAX - 1,达到最大限制,开始回溯
        {
            i --;
        }
        if(a[i] == MAX - 1 && i == 1) //试完所有解,退出
        {
            break;
        }
        else
        {
            a[i]++;   //从下一列开始
        }
    }
    return 0;
}
[/code]

3 楼


2楼程序只有1种情况,当i取2时,第一列就全为0,不符合要求,怎么改?

4 楼

没有考虑4,8,、、行全取0,主要是方法,lz自己看吧。

我来回复

您尚未登录,请登录后再回复。点此登录或注册