ZOJ 1136 Multiple

这题做出来了我很高兴,两天做了3个BFS,(Knight Moves,Find The Multiple)
前两个还比较快,1136这个费了好些时间。刚开始时,题没看清楚,以为是要求M和N的最小能表达的公倍数。提交了结果是RE,非常郁闷。先以为是内存不够用了,改了两个编码错误之后提交还是RE,幸亏后来发现RE下面还有个提示,一查,原来是除零错误。
   原文中有
between 0 and 4999 (inclusively),一不小心没考虑到0(谁会觉得会出0这个东西啊)
   改正之后AC.

   关于我的代码,基本上也没什么好说的,STL的队列,然后一个含有输出数字的STRING和一个余数保存,FLAG数组保存可用的数字。RESFLAG数组保存已经出现的余数剪枝。没了

#include <iostream>
#include <string>
#include <queue>
using namespace std;
bool FLAG[10];
bool RESFLAG[5000];
struct NODE
{
 string out;
 int res;
};
int main()
{
    int a,i,t,n;
 bool flag;
 queue<NODE> ChuanQ;
 NODE tt,x;
    while(cin >> a)
    {
  if(a==0)
  {   
   cin >> n;
   while(n--)
   {
    cin >> t;
   }
   cout << "0" << endl;
   continue;
  }
  for(i=0;i<a;++i)
   RESFLAG[i] = false;
  flag = false;
  for(i=0;i<10;++i)
   FLAG[i] = false;
        cin >> n;
  while(n--)
  {
   cin >> t;
   FLAG[t] = true;
  }
  for(i=1;i<10;++i)
  {
   tt.out = '0'+ i;
   tt.res = i%a;
   if(FLAG[i]!=false)
    ChuanQ.push(tt);
  }
  while(!ChuanQ.empty())
  {
   tt = ChuanQ.front();
   ChuanQ.pop();
   if(tt.res%a==0)
   {
    flag = true;
    break;
   }
   for(i=0;i<10;++i)
   {
    if(FLAG[i]!=false)
    {
     x.out = tt.out;
     x.out += (char)(i+'0');
     x.res = tt.res * 10 + i;
     x.res = x.res%a;
     if(RESFLAG[x.res]==false)
      ChuanQ.push(x);
     RESFLAG[x.res] = true;
    }
   }
  }
  if(flag==true)
   cout << tt.out << endl;
  else
   cout << "0" << endl;
  while(!ChuanQ.empty())
   ChuanQ.pop();
    }
    return 0;
}
posted on 2006-09-18 15:48  AnewR  阅读(1138)  评论(0编辑  收藏  举报