c语言 一个n*n的方阵 要求每行每列元素只有一个1 其他都是0,输出所有可能结果。我要思路!打出主要代码

如题所述

你这个应该排列问题 每行每列都只有一个是1 假设你的n是3 矩阵有一种就是
100
010
001
把他换成普通数组实际上就是 123
那么321就是
001
010
100
同理132就是
100
001
010
那么你这个问题应该可以转成 n个数的排列问题。那么a[n] 假设a[0]=1代表第一行第1个数是1 a[1]=3 代表第二行第三个数是1 a[i]=n代表第i+1行第n个数是1. 这样的话你再转成矩阵赋值输出就可以了。。数组排列问题百度上有很多追问

把你QQ号告诉我 我的是401313881 你加我也可以 记得说是谁。。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-31
xmhpearl 说的没错,不过这个答案不是唯一解把例如

1 0 0
0 1 0
0 0 1 是一种

0 1 0
1 0 0
0 0 1 也可以吧

如果标准的话应该取随机数。
思路是在第一行里面随意任人选一个比如m列,打1;
然后再第二行里出m列外任选一个n,打1;
然后第三行m,n外任选一个打1;
以此类推。

这样每次生成的仿真随即但满足题目要求

代码我这里就不写了。

哦不好意,没看到需要所有解,那么我补充一下。

既然这样就不用随即了,应该是遍历所有可能性。

当第一行选0列时 第二行可选1 - n
让后第二行选1的话,第三行就是 2 - n,选2的话就是 1 ,3 -n像这样一层一层遍历所有可能性就可以了。

需要代码的话,有空贴上来
第2个回答  2012-08-04
主要思路:在第一行随机选一个数输出为1,然后再第二行随机选另外的一个数输出为1,依次类推
主要代码:
srand((unsigned)time(NULL));
for(i=0;i<n;i++)
{
while(b[m=rand()%n+1]);
b[m]=i;
} //将不重复的随机数存放在一个数组里面
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
{
if(b[i]==j)
printf("%d",1);
else
printf("%d",0);
}
printf("\n");
}
这个代码运行一次只会输出一种结果,但是你每次运行都会有不同的结果。直到把所有的结果都运行输出后,再运行就会出现一样的结果了。
第3个回答  2012-07-31
// vc2010测试通过,回溯法。
#include <iostream>
#include <vector>
using namespace std;
// 打印矩阵
void print_m( const vector< vector< int > > &m, int n )
{
for( int i = 0; i < n; i++ )
{
for( int j = 0; j < n; j++ )
cout << m[i][j];
cout << endl;
}
cout << endl;
}
// 判断当前矩阵是否合法(即current_line, current_col位置是否可以填1)
bool is_current_line_col_right( vector< vector< int > > &m, const int &n, int current_line, int current_col )
{
for ( int i = 0; i < current_line; i++ )
if ( m[i][current_col] )
return false;
return true;
}
// 尝试在当前行填一个1
void try_set_current_line( vector< vector< int > > &m, const int &n, int current_line )
{
for ( int i = 0; i < n; i++ )
{
if ( is_current_line_col_right( m, n, current_line, i ) )
{
m[current_line][i] = 1;
if ( current_line == n - 1 ) // 最后1行
print_m( m, n );
else
try_set_current_line( m, n, current_line + 1 );
m[current_line][i] = 0;
}
}
}
// 找出所有合法的n*n矩阵,并打印出来
void find_all_matrixes( int n )
{
vector< vector< int > > m;
m.resize( n );
for ( int i = 0; i < n; i++ )
m[i].resize( n );
try_set_current_line( m, n, 0 );
}
void main()
{
find_all_matrixes( 3 );
find_all_matrixes( 4 );
}追问

你QQ号告诉我呗 为了更好交流 我的是401313881 你加我也可以

追答

有问题发我邮箱吧,我极少上QQ。我的邮箱是[email protected]

第4个回答  2012-07-31
用I【k】【h】;数组,用扫面方式进行K,H与每个数的比较
相似回答