BSH 发表于 2011-7-10 21:41:47

一道算法问题 能帮我解决一下吗?

一道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其实就是sizepa是房间的头指针
        {   int buffer;       //跑堂的
                p=new A*;       //原盘有了
                for(int i=0;i<s;i++)
                {
                        cin>>buffer;   //输入数据表示每个原盘上的格子所指向的房间
          p=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;

count=1;

        while(pp->x!=pp->p->x&&count<100000000)
        {ix++;
                ix=ix%size;
                pp->p=pp->p->p;
       
               
                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;
P *pp=new P;
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;
}

BSH 发表于 2011-7-11 00:10:15

米有人啊- -:L
页: [1]
查看完整版本: 一道算法问题 能帮我解决一下吗?