hdu 5113 Black And White

题意是说用k重颜色填充n*m的方格,第i种颜色要用ci次,保证ci(i属于1..k)的和为n"m,问是否有可行解,若有,输出任意一种。 第一感觉是dfs.。。而且数据范围还那么小。但是鉴于我上次dfs写成汪的经历....嗯 不过群里有学长说似乎剪枝不太好想? 我一开始分了四类,o行o列,e行e列,e行o列,o行e列,(o是odd,e是even)然后将c[i]排序,先填大的C[I],感觉这样应该更容易找到解。交了一发,WA掉了。。发现当k较小的时候,也就是c[i]都相对较大的时候,先填大的C[I]的策略会出现错误。于是我换了下....按c[i]的大小从两边往中间...然后我还发现其实o行o列和e行e列可以归为一类,同理,后两种也可以归为一类。又交,又WA2333333  然后想了好久。。。 发现对于上面说的两类的处理顺序不同会得到不同的结果.......只有一种是对的。于是加了个judge函数判断冲突...如果冲突就换个顺序.....再交,A了。

过程中出现了两个语法上的错误....**一个是=写成了==(从来都是把==写成=。。。) 另一个是无参数的函数依然要写()。。。。。。

确实不难....的确是我生疏了。

  1
  2    
  3    /* ***********************************************
  4    Author :111qqz
  5    Created Time :2016年02月19日 星期五 16时20分07秒
  6    File Name :code/hdu/5113.cpp
  7    ************************************************ */
  8    
  9    #include <iostream>
 10    #include <algorithm>
 11    #include <cstring>
 12    
 13    using namespace std;
 14    
 15        int c[100],cc[100];
 16        int ans[10][10];
 17        int colorid[100];
 18        int n,m,k;
 19        void look();
 20    bool judge();
 21    
 22    
 23    int main()
 24    {
 25        int tt;
 26        int t;
 27        int kk;
 28    
 29        cin>>t;
 30        tt=t;
 31    
 32    
 33        int i,j;
 34        int head;
 35        int flag;
 36       while (t--)
 37        {  head=1;
 38        flag=1;
 39             memset(ans,0,sizeof(ans));
 40            cin>>n>>m>>k;
 41            kk=k;
 42            for (i=1;i<=k;i++)
 43                cin>>c[i];
 44    
 45            for (i=1;i<=k;i++)
 46                colorid[i]=i;
 47            for (i=1;i<k;i++)
 48                for (j=i+1;j<=k;j++)
 49                if (c[i]>c[j])
 50                {
 51                  swap(c[i],c[j]);
 52                  swap(colorid[i],colorid[j]);
 53                }
 54                 for (i=1;i<=k;i++)
 55                    cc[i]=c[i];
 56    
 57    
 58    
 59            if (c[k]>(n*m+1)/2)  { cout<<"Case #"<<tt-t<<":"<<endl;cout<<"NO"<<endl;continue;}
 60    
 61            for (i=1;i<=n;i++)
 62                for (j=1;j<=m;j++)
 63                    if ((i%2+j%2)%2==1)
 64                    {
 65                      if (flag%2==1)
 66                      {
 67    
 68    
 69                         ans[i][j]=colorid[k];
 70                        // cout<<"i:"<<i<<"j:"<<j<<" "<<colorid[k]<<endl;
 71    
 72                         c[k]--;
 73                         if (c[k]==0)
 74                            {
 75                                k--;
 76                                flag++;
 77    
 78                            }
 79                      }
 80                      else
 81                        {
 82                            ans[i][j]=colorid[head];
 83    
 84                        //    cout<<"i:"<<i<<"j:"<<j<<"  "<<colorid[head]<<endl;
 85                            c[head]--;
 86                            if (c[head]==0)
 87                            {
 88                                head++;
 89                                flag++;
 90    
 91                            }
 92                        }
 93                      //  look();
 94                    }
 95    
 96    
 97                    for (i=1;i<=n;i++)
 98                for (j=1;j<=m;j++)
 99                    if ((i%2+j%2)%2==0)
100                    {
101    
102    
103                        if (flag%2==1)
104                      {
105    
106    
107                         ans[i][j]=colorid[k];
108                      //   cout<<"i:"<<i<<"j:"<<j<<" "<<colorid[k]<<endl;
109                         c[k]--;
110                         if (c[k]==0)
111                            {
112                                k--;
113                                  flag++;
114                            }
115                      }
116                      else
117                        {
118                            ans[i][j]=colorid[head];
119                          // cout<<"i:"<<i<<"j:"<<j<<"  "<<colorid[head]<<endl;
120                            c[head]--;
121                            if (c[head]==0)
122                            {
123                                head++;
124                               flag++;
125                            }
126                        }
127                     //   look();
128                    }
129                   cout<<"Case #"<<tt-t<<":"<<endl;
130                   cout<<"YES"<<endl;
131    
132                    if (!judge())
133                         look();
134                   else
135                   {
136    
137    
138                       k=kk;
139                       head=1;
140                       flag=1;
141                       for (i=1;i<=k;i++)
142                           c[i]=cc[i];
143                       memset(ans,0,sizeof(ans));
144    
145                       for (i=1;i<=n;i++)
146                        for (j=1;j<=m;j++)
147                            if ((i%2+j%2)%2==0)
148                        {
149                            if (flag%2==1)
150                            {
151                         ans[i][j]=colorid[k];
152                       //  cout<<"i:"<<i<<"j:"<<j<<" "<<colorid[k]<<endl;
153    
154                         c[k]--;
155                         if (c[k]==0)
156                            {
157                                k--;
158                                flag++;
159    
160                            }
161                      }
162                      else
163                        {
164                            ans[i][j]=colorid[head];
165    
166                         //   cout<<"i:"<<i<<"j:"<<j<<"  "<<colorid[head]<<endl;
167                            c[head]--;
168                            if (c[head]==0)
169                            {
170                                head++;
171                                flag++;
172    
173                            }
174                        }
175                      //  look();
176                    }
177                    for (i=1;i<=n;i++)
178                for (j=1;j<=m;j++)
179                    if ((i%2+j%2)%2==1)
180                    {
181    
182    
183                        if (flag%2==1)
184                      {
185    
186    
187                         ans[i][j]=colorid[k];
188                        // cout<<"i:"<<i<<"j:"<<j<<" "<<colorid[k]<<endl;
189                         c[k]--;
190                         if (c[k]==0)
191                            {
192                                k--;
193                                  flag++;
194                            }
195                      }
196                      else
197                        {
198                            ans[i][j]=colorid[head];
199                         //  cout<<"i:"<<i<<"j:"<<j<<"  "<<colorid[head]<<endl;
200                            c[head]--;
201                            if (c[head]==0)
202                            {
203                                head++;
204                               flag++;
205                            }
206                        }
207                     //   look();
208                    }
209                      look();
210    
211                   }
212    
213    
214    
215        }
216        return 0;
217    }
218    
219    
220    void look()
221    {
222        //  cout<<"lookkkkkkkkkkkkkkkkkkkkk"<<endl;
223        int i,j;
224        for (i=1;i<=n;i++)
225            for (j=1;j<=m;j++)
226                if (j!=m)
227              cout<<ans[i][j]<<" ";
228             else cout<<ans[i][j]<<endl;
229    
230    }
231    bool judge()
232    {
233        int i,j;
234        for (i=1;i<=n;i++)
235            for (j=1;j<m;j++)
236             if (ans[i][j]==ans[i][j+1])
237               return true;
238        for (i=1;i<n;i++)
239            for (j=1;j<=m;j++)
240            if (ans[i][j]==ans[i+1][j])
241              return true;
242          return false;
243    }
244    
245
246