| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
建图然后bfs,23333以n的剩余系为点,然后用同余定理建图
即以任意x为起点,它的临界点为y=[x(mod n) * 10(mod n)](mod n)
和z=(y+1) (mod n)
只需要找到一条由1至0的路径,然后输出路径就好了
代码如下:
#include<iostream>
#include<queue>
using namespace std;
void bfs();
void dfs(int);
void ins();
int n;
int pr[210];
bool V[210];
int A[210][2];//利用邻接表存储每个点的临接点
int main()
{
while(cin>>n && n!=0)
{
if(n==1)
cout<<n<<endl;
else
{
ins();//建图
bfs();
cout<<endl;
}
}
return 0;
}
void ins()
{
for(int i=1;i<=n-1;i++)
{
int p=( (i%n)*(10%n) ) %n;//同余定理
A[i][0]=p;//乘十
A[i][1]=(p+1)%n;//乘十加一
}
}
void bfs()//
{
queue<int> Q;
int i,j,k;
for(i=0;i<=n;i++)
pr[i]=i;
memset(V,0,sizeof(V));
Q.push(1);
V[1]=true;
while(V[0]==false)
{
int x=Q.front();
Q.pop();
for(i=0;i<=1;i++)
{
int y=A[x][i];
if(!V[y])
{
pr[y]=x;
Q.push(y);
V[y]=1;
}
}
}
cout<<1;//1为起点
dfs(0);
}
void dfs(int x)//递归查找路径
{
if(x!=1)
{
dfs(pr[x]);
int c=A[pr[x]][0];
if(c==x)
printf("0");//乘十
else
printf("1");//乘十加一
}
return ;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator