|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一道ACM里面的题目 先给个传送门http://poj.org/problem?id=1282
他老是说我wrong answer 有木有人耐心的帮我看看问题...?
我输入了2组数据显示正确 了啊。。。。。
下面是我的代码
#include<iostream>
using namespace std;
int num; //定义一共多少个房间
int size; //门里面圆盘上有多少个格子
int ix; //当前格子指向 ix=0为最初指向 每ix+1 相当于圆盘转一下
int count=0;
struct A //定义一个房间类
{
int x; //它有自己的编号
struct A **p; //这是原盘
void Init(int s,A * pa) //初始化 s其实就是size pa是房间的头指针
{ int buffer; //跑堂的
p=new A*[s]; //原盘有了
for(int i=0;i<s;i++)
{
cin>>buffer; //输入数据 表示每个原盘上的格子所指向的房间
p[i]=pa+buffer-1; //输入数据 表示每个原盘上的格子所指向的房间
}
}
};
struct P //定义人类
{ //人类 有他自己的编号
int x;
A *p; //人可以指向一个房间
};
int fx(int a,int b)
{int last=a;
int begin=b;
int r;
while(b!=0)
{r=a%b;
a=b;
b=r;}
return last*begin/a;
} //算公倍数的函数
int get(A *pa,P *pp,int sum)
{
pp->p=pp->p->p[ix];
count=1;
while(pp->x!=pp->p->x&&count<100000000)
{ ix++;
ix=ix%size;
pp->p=pp->p->p[ix];
count++;
//cout<<pp->p->x<<" "<<pp->x<<endl;
} //这个就是算法 获得某一个人再次回到同一房间所要的次数
if(count>=100000000) return 1000000000;
else return fx(sum,count); //求出与先前一个sum公倍数
}
int main()
{
int sum=1;
cin>>num;
cin>>size;
ix=0;
A *pa=new A[200];
P *pp=new P[200];
for(int i=0;i<num;i++)
{(pa+i)->Init(size,pa);
(pp+i)->p=(pa+i);
(pp+i)->x=i;
(pa+i)->x=i;
} //初始化
for(int ip=0;ip<num;ip++)
{ix=0; sum=get(pa,pp+ip,sum);
if(sum>=1000000000)break;
}
if(sum!=1000000000)cout<<sum<<endl;
else cout<<"No one knows."<<endl;
return 0;
}
|
|