USACO 4.3 The Primes(模拟枚举)

自己辛辛苦苦加了tire树的直接暴力dfs版本的,过了两组。。。看了看题解,先枚举对角线,只要枚举几位,有些就可以确定了。。。写完后,改改越界什么的,各种调之后,终于过了。。。

枚举两天对角线后,再枚举(1,2),(1,3)可得(1,4)枚举(3,2)可得(5,2)枚举(2,3)....反正中间各种细节。。。首位不能为0什么的。

  1 /*
  2   ID:cuizhe
  3   LANG: C++
  4   TASK: prime3
  5  */
  6  #include <cstdio>
  7  #include <cmath>
  8  #include <cstring>
  9  #include <iostream>
 10  #include <algorithm>
 11  #include <map>
 12  using namespace std;
 13  #define N 100000
 14  struct node
 15  {
 16      int a[6];
 17  } ans[101];
 18  int t,z,num = 1,tt = 0;
 19  int o[N],oo[N];
 20  int flag[N];
 21  int mat[8][8];
 22  int que[10001];
 23  int key[11];
 24  int judge(int flag,int x)
 25  {
 26      int i,sum = 0;
 27      if(flag == 1)
 28      {
 29          for(i = 1; i <= 5; i ++)
 30              sum = sum*10 + mat[x][i];
 31      }
 32      else if(flag == 2)
 33      {
 34          for(i = 1; i <= 5; i ++)
 35              sum = sum * 10 + mat[i][x];
 36      }
 37      if(oo[sum] == 1)
 38          return 1;
 39      else
 40          return 0;
 41  }
 42  int cmp(const node &x,const node &y)
 43  {
 44      int i;
 45      for(i = 1;i <= 5;i ++)
 46      {
 47          if(x.a[i] < y.a[i])
 48          return 1;
 49          else if(x.a[i] > y.a[i])
 50          return 0;
 51      }
 52      return 1;
 53  }
 54  int main()
 55  {
 56  
 57      freopen("prime3.in","r",stdin);
 58      freopen("prime3.out","w",stdout);
 59      int sum,n,temp,cal,i,j;
 60      int i1,i2,i3,i4,i5,i6,i7,i8,i9;
 61      for(i = 2; i < 320; i ++)
 62      {
 63          if(!o[i])
 64          {
 65              for(j = i+i; j < N; j += i)
 66              {
 67                  o[j] = 1;
 68              }
 69          }
 70      }
 71      scanf("%d%d",&sum,&n);
 72      for(i = 10000; i < N; i ++)
 73      {
 74          if(!o[i])
 75          {
 76              cal = 0;
 77              temp = i;
 78              while(temp)
 79              {
 80                  cal += temp%10;
 81                  temp /= 10;
 82              }
 83              if(cal != sum) continue;
 84              oo[i] = 1;
 85              que[num++] = i;
 86          }
 87      }
 88      for(i1 = 1; i1 < num; i1 ++)
 89      {
 90          if((que[i1]/10000)%10 == n)
 91          {
 92              temp = que[i1];
 93              for(i2 = 1; i2 <= 5; i2 ++)
 94              {
 95                  mat[6-i2][6-i2] = temp%10;
 96                  temp /= 10;
 97              }
 98              for(i2 = 1; i2 < num; i2 ++)
 99              {
100                  if((que[i2]/100)%10 == mat[3][3])
101                  {
102                      temp = que[i2];
103                      for(i3 = 1; i3 <= 5; i3 ++)
104                      {
105                          mat[i3][6-i3] = temp%10;
106                          temp /= 10;
107                      }
108                      for(i3 = 1; i3 <= 9; i3 ++)
109                      {
110                          mat[1][2] = i3;
111                          for(i4 = 1; i4 <= 9; i4 ++)
112                          {
113                              mat[1][3] = i4;
114                              mat[1][4] = sum - i3 - i4 - mat[1][1] - mat[1][5];
115                              if(mat[1][4] <= 0||mat[1][4] >= 10) continue;
116                              if(!judge(1,1)) continue;
117                              for(i5 = 0; i5 <= 9; i5 ++)
118                              {
119                                  mat[3][2] = i5;
120                                  mat[5][2] = sum - i5 - mat[1][2] - mat[2][2] - mat[4][2];
121                                  if(mat[5][2] < 0||mat[5][2] >= 10) continue;
122                                  if(!judge(2,2)) continue;
123                                  for(i6 = 0; i6 <= 9; i6 ++)
124                                  {
125                                      mat[2][3] = i6;
126                                      for(i7 = 0; i7 <= 9; i7 ++)
127                                      {
128                                          mat[3][4] = i7;
129                                          mat[5][4] = sum - mat[1][4] - mat[2][4]- mat[3][4]- mat[4][4];
130                                          if(mat[5][4] < 0||mat[5][4] >= 10) continue;
131                                          if(!judge(2,4)) continue;
132                                          mat[5][3] = sum - mat[5][1] - mat[5][2] - mat[5][4] - mat[5][5];
133                                          if(mat[5][3] < 0||mat[5][3] >= 10) continue;
134                                          if(!judge(1,5)) continue;
135                                          mat[4][3] = sum - mat[1][3] - mat[2][3] - mat[3][3] - mat[5][3];
136                                          if(mat[4][3] < 0||mat[4][3] >= 10) continue;
137                                          if(!judge(2,3)) continue;
138                                          for(i8 = 1; i8 <= 9; i8 ++)
139                                          {
140                                              mat[2][1] = i8;
141                                              mat[2][5] = sum - mat[2][1] - mat[2][2] - mat[2][3] - mat[2][4];
142                                              if(mat[2][5] < 0||mat[2][5] >= 10) continue;
143                                              if(!judge(1,2)) continue;
144                                              for(i9 = 1; i9 <= 9; i9 ++)
145                                              {
146                                                  mat[3][1] = i9;
147                                                  mat[3][5] = sum - mat[3][1] - mat[3][2] - mat[3][3] - mat[3][4];
148                                                  mat[4][5] = sum - mat[1][5] - mat[2][5] - mat[3][5] - mat[5][5];
149                                                  mat[4][1] = sum - mat[4][2] - mat[4][3] - mat[4][4] - mat[4][5];
150                                                  temp = sum - mat[1][1] - mat[2][1] - mat[3][1] - mat[5][1];
151                                                  if(temp != mat[4][1]) continue;
152                                                  if(mat[3][5] < 0||mat[3][5] >= 10) continue;
153                                                  if(mat[4][5] < 0||mat[4][5] >= 10) continue;
154                                                  if(mat[4][1] <= 0||mat[4][1] >= 10) continue;
155                                                  if(!judge(1,3)) continue;
156                                                  if(!judge(1,4)) continue;
157                                                  if(!judge(2,1)) continue;
158                                                  if(!judge(2,5)) continue;
159                                                  z = 1;
160                                                  for(i = 1; i <= 5; i ++)
161                                                  {
162                                                      temp = 0;
163                                                      for(j = 1; j <= 5; j ++)
164                                                          temp = temp*10 + mat[i][j];
165                                                      ans[tt].a[i] = temp;
166                                                  }
167                                                  tt ++;
168                                              }
169                                          }
170                                      }
171                                  }
172                              }
173                          }
174                      }
175                  }
176              }
177          }
178      }
179      sort(ans,ans+tt,cmp);
180      for(i = 0; i < tt; i ++)
181      {
182          if(i != 0)
183              printf("\n");
184          for(j = 1; j <= 5; j ++)
185              printf("%d\n",ans[i].a[j]);
186      }
187      if(!z) printf("NONE\n");
188      return 0;
189  }

 

posted @ 2013-03-26 22:17  Naix_x  阅读(276)  评论(0)    收藏  举报