- 论坛徽章:
- 0
|
我也来试试 :)
我的办法比较笨 :(
- int main(void)
- {
- int i, j, k;
- int yes = 0; //有yes个人说对了
- char a[4][4] =
- {
- 'n','a','a','a',
- 'a','a','a','y',
- 'a','y','a','a',
- 'a','a','a','n'
- }; //a[i][j] == y 表示i说j偷的 a[i][j] == n 表示i说j没偷 a[i][j] == a 表示i对j没表态
-
- char b[4]; //在假设东西是某个人偷的情况下, b[i] == y 表示是i偷的, b[i] == n 表示不是i偷的
- char c[4]; //c[i] == y 表示i说话正确,c[i] == n 表示i撒谎了
- //如果i说是某个人偷的,表示i承认其余的人没有偷,所以对a[4][4]进行如下处理
- for (i = 0; i < 4; i++)
- {
- for (j = 0; j < 4; j++)
- {
- if (a[i][j] == 'y')
- for (k = 0; k < 4; k++)
- {
- if (k == j)
- break;
- a[i][k] = 'n';
- }
- }
- }
-
- //打印处理结果
- for ( i = 0; i < 4; i++)
- {
- for (j = 0; j < 4; j++)
- {
- printf("%c", a[i][j]);
- if ( (j+1) % 4 == 0)
- printf("\n");
- }
- }
- for (i = 0; i < 4; i++) //假设是第i个人偷的
- {
- yes = 0;
- //假设是第i个人偷的,则排除是其他人偷的
- for (j = 0; j < 4; j++)
- {
- if (j != i)
- b[j] = 'n';
- else
- b[j] = 'y';
- }
-
- //打印假设结果
- for ( j = 0; j < 4; j++)
- printf("%c ", b[j]);
- printf("\n");
-
- //判断第j个人说的对否
- for (j = 0; j < 4; j++)
- {
- for (k = 0; k < 4; k++)
- {
- if (a[j][k] == 'a')
- continue;
- if (a[j][k] != b[k])
- {
- c[j] = 'n';
- break;
- }
- c[j] = 'y';
- }
- }
- //判断这种假设情况下,没有撒谎的人是几个
- for ( j = 0; j < 4; j++)
- {
- if (c[j] == 'y')
- yes++;
- }
- printf("如果假设是第i=%d个人偷的,说真话的有%d个人\n", i, yes);
- if (yes == 1)
- {
- printf("强盗是第i= %d\n", i);
- }
- else
- {
- printf("这种假设不成立!\n");
- }
- }
- return 0;
- }
复制代码
[ 本帖最后由 zhuhefang2006 于 2008-6-26 10:07 编辑 ] |
|