您的位置:首页 > 其它

【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

2013-08-20 19:36 381 查看
方法一:循环枚举

这是最常见的方法了,也是入门级的东西....

#include <stdio.h>

int main(){

int i,j,k;

for(i=1;i<5;++i)
for(j=1;j<5;++j)
for(k=1;k<5;++k)
if(i!=j && j!=k && k!=i)
printf("%d %d %d\n",i,j,k);

return 0;
}


方法二:深度优先搜索

使用搜索的思想,进行深度优先搜索,同样的广度的也可以。

#include <stdio.h>

int used[4];
int buff[4];

void dfs(int x,int deep){

int i;

if(deep == 3)printf("%d %d %d\n",buff[1],buff[2],buff[3]);

else {

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

if(!used[i]){

buff[deep+1] = i;

used[i]++;
dfs(i,deep+1);
used[i]--;
}
}
}
}

int main(){

int i;

used[1] = used[2] = used[3] = 0;

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

buff[1] = i;

used[i]++;
dfs(i,1);
used[i]--;
}

return 0;
}


方法三:

直接使用STL

#include <iostream>
#include <algorithm>

using namespace std;

int main(){

int base[4] = {1,2,3,4};

do{

printf("%d %d %d\n",base[0],base[1],base[2]);

}while(next_permutation(base,base+4));

return 0;
}

方法四:

广度优先搜索,写的比较复杂,练手用的....

#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

struct node{

__int8 buff[4];
__int8 flag;
__int8 length;

node(){memset(this,0,sizeof(node));}

bool is_end(){return length == 3;}

bool is_exist(int x){return flag & 1<<x;}

node & extend(int x){

node *temp = new node();

temp = (node*)memcpy(temp,this,sizeof(node));

temp->length++;
temp->buff[temp->length] = x;
temp->flag |= 1<<x;

return *temp;
}

friend ostream & operator << (ostream &o,node &n){

o << (int)n.buff[1] << " ";
o << (int)n.buff[2] << " ";
o << (int)n.buff[3] << "\n";

return o;
}
};

void bfs(){

node temp;
queue<node> q;

q.push(node());

while(!q.empty()){

temp = q.front();q.pop();

if(temp.is_end())cout << temp;

else {

for(int i=1;i<=4;++i){

if(!temp.is_exist(i))
q.push(temp.extend(i));
}
}
}
}

int main(){

bfs();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐