求助c语言大佬,有hiht的问题,最好有代码

是真的没有思路,给个思路也可以啊

只试了示例的数据,不知道其他的可不可以

#include<stdio.h>


int main() {

  int n;

  while ((scanf("%d", &n)) == 1) {

    int a[n][n], s[n][n], b[n];


    for (int i = 0; i < n; i++)

      for (int j = 0; j < n; j++)

        if (i == j)

          a[i][j] = s[i][j] = i + 1;

        else

          a[i][j] = s[i][j] = 0;


    for (int i = 0; i < n; i++)

      scanf("%d", &b[i]);


    int x = 0;

    while (1) {

      x++;

      if (x >= n) {

        printf("No solution!\n");

        break;

      }


      for (int i = 0; i < n; i++) {

        for (int j = 0; j < n; j++)

          if (a[i][j] != 0)

            s[b[i] - 1][j] = a[i][j];

      }


      for (int i = 0; i < n; i++)

        for (int j = 0; j < n; j++)

          a[i][j] = s[i][j];


      int k;

      for (k = 0; k < n; k++)

        if (a[n - 1][k] != k + 1)

          break;


      if (k == n && x < n) {

        printf("%d\n", x);

        break;

      }

    }

  }


  return 0;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-04-11
思路也很简单。
设定一个一维数组,数组长度为n-1。因为第n个人为Taylor本人,他本人肯定知道自己的秘密。其初始值全部为0,表示还不知道秘密。
再设定一个一维数组,长度为n,用来接收传递规则。
再设一个bool变里,是否已全部找到。初始值为false
现在开始for循环,没有找到且在循环次数内,就循环。循环次数,就是需要经过多少轮。最多不会超过n轮。当然经过一些深入分析,可以减少循环轮数。这里不管了。
第二层for循环,长度就是n。循环传递规则
依次从规则数组里把传递对象取出来,
这里要判断一下传的对象是不是n,是n代表本人,到了本人了就去遍历一下秘密数组其组是否全部为1。如果全部为1,表示已全部知道秘密了,并置找到的bool变量为true,并结束本层循环。
如果不是n,则把秘密数组对应的值 设为1。

另外如何判断秘密数组全部是1?
遍历秘密数组,如果是0就break。如果是1就不管。
本for循环结束后,判断循环变量是不是大于n-1.如果是则表明for是由次数超标而结束,则是全部是1。如果不大于n-1。则表明是由于break结束的。肯定是没有全部找到。
如果循环变里从,0和从1开始循环要注意。本回答被网友采纳
第2个回答  2020-04-11
#include<stdio.h>#include<stdlib.h>#include<string.h>void circ()int main(){ int n,i=1,j; while(1)//控制输入组数 { scanf("%d",&n); int turn[n+1],people[n+1]=0,x=0,t[n]; people[n+1]=1,t[0]=n;//自己知道自己的秘密; for(i=1; i<n+1; i++) scanf("%d",&turn[i]); for(j=1; turn[j]==n; j++) { circ(t[n],&i,turn,people);//往上找,告密,把告诉第n个人的秘密记为1,类推;就是个树状的结构,往上找,遍历,或者线性规划。你自己写一下。 for(i=1; people[i]&&i<n+1; i++);//检查是否所有人的秘密都知道,或者不再可能知道秘密; if(i==n+1) { printf("%d",j); break; }//也就是people里全为1了,结束程序; if(n=x)//people里不全为1,但是往上找已经找了一轮了,说明不可能知道全部秘密。 { printf("No solution!"); break; }//如果都不满足,说明可以继续往上找,进行新一轮告密。 } } return 0;}
大概思路就这样,那个往上遍历查找,我相信你会写的,加油,还有问题再追问。追答

看铅笔部分

第3个回答  2020-04-11
用n*n的二维数组,i行i列赋值为i,比如第一个例子就是{{1000}{0200}{0030}{0004}},然后1告诉2就变成了{{1000}{1200}{0030}{0004}},2告诉4,{{1000}{1200}{0030}{1204}},3告诉2,{{1000}{1230}{0030}{1204}},4告诉1,{{1204}{1230}{0030}{1204}},第一轮就这样,当第四行1234齐了就break,当整个数组没变化也break,就是没有答案追问

我们还没学二维数组,有别的方法吗,或者给个代码?谢谢回答

追答

不用二维数组我也没什么办法,代码有点长,懒得写

追问

一段也行,我真的不知道怎么写

相似回答