Bootstrap

P1008 三连击(dfs)

在这里插入图片描述
这道题我记得好像啊哈算法上面讲过dfs;哎呀反正不管了;重新写一遍也是好的;
我利用的向量来存的数字;以个数为结束条件来的dfs;为什么呢?
dfs思路:比如:
1 2 3 这三个数,他的全排列有哪些? 1 2 3 ,1 3 2 , 2 1 3 ,2 3 1, 3 1 2, 3 2 1;就这几种,其实就是利用dfs的思想排出来的;
因为当你标记1已经放到第一个位置时,那么第二个你就标记2放入第二个位置,然后第三个你就标记3放入第三个位置,之后返回到取消3的标记返回到上一层,那么就是把3放到2位置上,然后2放到3位置上;基本dfs思路就是这样滴;
所以AC代码:

#include<bits/stdc++.h>
using namespace std;
vector<int> Ve;
int book[10];
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}
void dfs(int num){
	  if(num==9){//如果9个数填满了
	  	int A=0,B=0,C=0;
	     for(int i=0;i<9;i++){//这里计算一下值就行了
	     	  if(i<3){
	     	  	  A=A*10+Ve[i];
			   }else if(i<6){
			   	  B=B*10+Ve[i];
			   }else if(i<9){
			   	  C=C*10+Ve[i];
			   }
			   int t1=gcd(A,B),t2=gcd(B,C);//其实这里可以不用算gcd的;
			   if(2*A/t1==B/t1&&3*B/t2==2*C/t2){//成比例,用笔算一下或者想一下就可以知道这个等式
			   	  printf("%d %d %d\n",A,B,C);
			   } 
		 }
	     return ;	
	  }
	  for(int i=1;i<=9;i++){
	  	   if(!book[i]){
	  	   	book[i]=1;
	  	   	  Ve.push_back(i);
	  	   	  dfs(num+1);
	  	   	  book[i]=0;
	  	   	  Ve.pop_back();
			 }
	  }
}
int main(){
   dfs(0);
	return 0;
} 
;