【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
2013-08-20 19:36
381 查看
方法一:循环枚举
这是最常见的方法了,也是入门级的东西....
方法二:深度优先搜索
使用搜索的思想,进行深度优先搜索,同样的广度的也可以。
方法三:
直接使用STL
方法四:
广度优先搜索,写的比较复杂,练手用的....
#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;
}
这是最常见的方法了,也是入门级的东西....
#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;
}
相关文章推荐
- 【程序11】 题目:有1、2、3、4个数字,能组成多少个互不相同且无 重复数字的三位数?都是多少?
- 程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
- 【程序11】 TestTN.java 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 【python】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 汇编之题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?...
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? (基础c++)
- 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 题目:有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- [Java] 练习题011: 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?