C语言乔瑟夫问题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


void main()
{   void joseph(int n, int m);
    int num,t;
    printf("输入总人数:");
    scanf("%d",&num);

    printf("输入出局号:");
    scanf("%d",&t);

    joseph(num, t);
}



void joseph(int n, int m)
{
    int status[100]= {0};//未出局的人标记为0,出局的人标记为其出局次序
    int count=0;
    int i=p=j=-1;

    printf("出局次序:\n");
    while(count < (n-1))//剩最后一个不用数
    {
        p=0;
        while(1)
        {
            i = (i+1) % n;//当位数超过人数时从第一个再开始
            if(status[i] == 0)//没被踢出去
            {
                p++;//指针位置移动
            }
            if(p == m)
            {
                count++;//被踢出去得次序
                status[i] = count;//被踢出去
                printf("第%d位出局:%d号\n",count,i+1);
                break;
            }
        }
    }
    for(j=0; j<n; j++)
    {
        if(status[j] == 0)
        {
            printf("胜利者:%d号\n",j+1);
        }
    }
}

按照以下要求写出的代码存在问题,请你修正,要求:描述 瑟夫是个习惯旅游的人,今天他买了地图打算在Z市旅游,Z市有 n个旅游景点,按从 1 到 n 编号。地图中有一组n维矩阵,表示i和j两个景点之间的路程距离。瑟夫喜欢自驾游,但是他身上有个魔咒,开车距离大于一定数值d,车子就会爆炸。 如果从景点i出发,到达某一其他景点j的最小开车距离不超过(即小于等于)距离d,则认为景点i存在一个安全景点。 瑟夫希望能在地图上找到一个景点,它的安全景点最多,如果有多个安全景点并列最多,则选择编号最大的景点。 输入 输入的第一行是两个整数n(1 ≤ n ≤ 200),表示景点个数;和 d 表示开车不超过的最大距离,d的取值保证一定有符合条件的景点。 接下来是n行,每行n个整数,表示地图中1~n个景点之间的距离w(-1 ≤ w ≤ 100)(0表示景点到自己的距离;-1表示景点i和j之间没有直接路径),景点i到j的距离等于景点j到i的距离。 输出 输出为一个整数,表示符合条件的景点的编号(如果有多个安全景点最多的景点,选择编号最大的景点)。代码:#include<iostream> using namespace std; int main() { int n,d,i,j,k,a[300][300],al[300][300],b[300],max,mi; cin>>n>>d; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cin>>a[i][j]; al[i][j]=a[i][j]; } } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(al[i][j]==-1) { for(k=1;k<=n;k++) { if(a[i][k]>0&&a[k][j]>0) al[i][j]=a[i][k]+a[k][j]; } al[j][i]=al[i][j]; } } } for(i=1;i<=n;i++) { b[i]=0; for(j=1;j<=n;j++) { if(al[i][j]<=d&&al[i][j]>0) b[i]++; } if(b[i]>=max) { max=b[i]; mi=i; } } cout<<mi<<endl; return 0; }
05-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值