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  }

 

你可能感兴趣的:(USACO)