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 }

 

posted @ 2015-06-06 12:30  JimmyLin^_^  阅读(344)  评论(0编辑  收藏  举报