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;
}
前两个还比较快,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;
}