POJ1166
额做了一个晚上和一个上午的题目……
看到马上想去BFS,于是发现诶要不用STL吧,上手竟然vector,简直nc,于是换queue,但是BFS始终写不好,很好奇到底怎么记录路径的,至今还是解决不了这个问题。于是放弃了STL,还是手打一个队列好了,不过还是过不了。
这里面有个大问题,我在运行的过程中会RTE,一直不知道什么问题,然后开始了恶心的输出中间结果调试,最后发现了大问题!在函数中申请了大数组,直接爆栈!其实以前也遇到过这个问题,竟然没有注意到!所以这种问题还是只能全局或者vector……
我还要去补STL,唉唉唉……
这道题嘛……其实暴力就解决了……来来来总结一下,深搜构造组合状态,然后判断,over,利用常量表解决这类问题啊。
按照这节奏,我估计是没救了,太慢了……而且我觉得C++的调试简直没救了……我去学学gdb好了不知道怎么样。
1 /********************************* 2 Problem POJ 1166 3 Status Accepted 4 Memory 692K 5 Time 266MS 6 Date 2015-06-06 7 By JimmyLin 8 *********************************/ 9 #include<iostream> 10 #include<cstdio> 11 #include<cstring> 12 13 using namespace std; 14 const int maxn=9,INF=1e8+10; 15 const char move[9][10]={"ABDE","ABC","BCEF","ADG","BDEFH","CFI","DEGH","GHI","EFHI"}; 16 int a[maxn]; 17 int b[maxn]; 18 int ans[maxn],ans_total=INF; 19 bool check() 20 { 21 /*for(int i=0;i<9;i++)cout<<a[i]<<' '; 22 cout<<endl; 23 */ 24 int c[maxn]; 25 for(int i=0;i<maxn;i++)c[i]=b[i]; 26 for(int i=0;i<9;i++){ 27 for(int j=0;move[i][j];j++){ 28 int cn=move[i][j]-'A'; 29 c[cn]=(c[cn]+a[i])%4; 30 } 31 } 32 for(int i=0;i<9;i++)if(c[i])return false; 33 return true; 34 } 35 void instead() 36 { 37 int tot=0; 38 for(int i=0;i<9;i++)tot+=a[i]; 39 if(tot<ans_total){ 40 ans_total=tot; 41 for(int i=0;i<9;i++)ans[i]=a[i]; 42 } 43 } 44 void print_ans() 45 { 46 for(int i=0;i<9;i++) 47 for(int j=1;j<=ans[i];j++)cout<<i+1<<' '; 48 } 49 void solve(int x) 50 { 51 if(x==9){ 52 if(check())instead(); 53 return; 54 } 55 for(int i=0;i<4;i++){ 56 a[x]=i; 57 solve(x+1); 58 } 59 } 60 int main() 61 { 62 for(int i=0;i<9;i++)cin>>b[i]; 63 solve(0); 64 print_ans(); 65 return 0; 66 }
当有那么一天,你相信你可以做到的时候,那你就真的能够做到!
路在脚下