一个比较复杂的判断,如何实现??????

xxsteven 2003-09-13 04:53:48
我有i,j,k,l 4个int类型的变量他们都是有唯一值的变量。通过一段程序给他们付了值,现在如何判断,这4个数里面只要有任意2个变量的值是1或0。
...全文
104 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qkhmyi 2003-09-14
  • 打赏
  • 举报
回复
可不可以把你的原问题讲出来听听。。。?
qkhmyi 2003-09-14
  • 打赏
  • 举报
回复
我上边说的那个判断式依赖于布尔变量的值,可能不具移植性,你自己看着办吧。。
不过在我知道的编译器上都是对的。。
 如果你的目的只是针对这个问题,你可以一个一个写出来,不过只需要6种情况,
redosuit可以不要,你只要把temp[0],temp[1],temp[2],temp[3]排序后,让01,02,03,
12,13,23和dosuit比较就可以了。。道理显然!
 如果你想解决更一般的问题,首先要实现一个功能:找出从N个数中选出M(M<N)个
数的所有排列,这个不难,你自己先想想吧。。
qkhmyi 2003-09-14
  • 打赏
  • 举报
回复
if(!i+!j+!k+!l==2||!(i-1)+!(j-1)+!(k-1)+!(l-1)==2)
pzeping2003 2003-09-14
  • 打赏
  • 举报
回复

同意楼上的算法,
xxsteven 2003-09-14
  • 打赏
  • 举报
回复
可以,问题就是一个pork游戏
一共用32张牌,我现在用0到31 来表示,有2个人在游戏,
每个人4张牌,
我提的问题就是2个人打和的牌的结构
比如我拿数字表示6张牌
(8 ,9|16 ,17|14 ,15),
如果我得到了这样的3张就是打和的牌。
8|16|14
8|17|14
14|8|16
9|14|17
但不能是8|9|17 ;16|17|15;14|15|17等等。
如何实现。。。
JoeRen 2003-09-14
  • 打赏
  • 举报
回复
bool a=(i>>1==0),b=(j>>1==0),c=(k>>1==0),d=(l>>1==0);
return (a || b || c) && (b || c || d) && (c || d || a)
xxsteven 2003-09-14
  • 打赏
  • 举报
回复
你说的对,我现在需要的是这样的算法,请帮我看看如何实现,整个过程分为2步
1,我有4个int变量,temp[0],temp[1],temp[2],temp[3],(找出从N个数中选出M(M<N)个
数的所有排列,这个不难,你自己先想想吧)我就是想看看他们4个的任意3个的排列个数并把他们循环排列打出来。如何实现呢?

2,我还有一组数(8 ,9|16 ,17|14 ,15),8和9是一组,16和17是一组,14和15是一组,
我要把每一个组中抽一个出来排序组成一个由3个数字组成的一组。比如:
8|16|14
8|17|14
14|8|16
9|14|17
但不能是8|9|17 ;16|17|15;14|15|17等等。
综合1和2,最后我想要的结果是看第一步里面的任意取出的3个数组成的字符串temp[0]|temp[1]|temp[2](不一定是012的顺序)的任意排列和第2步里面的所有组合成的字符串是否相等
如何解决呀?不知道我说清楚了没有
iceheart 2003-09-13
  • 打赏
  • 举报
回复

int iArray[4];
iArray[0] = i;
iArray[1] = j;
iArray[2] = k;
iArray[3] = l;
int count0 = 0;
int count1 = 0;
for (int nLoop = 0; nLoop < 4; nLoop++) {
if (iArray[0] == 0) count0++;
if (iArray[0] == 1) count1++;
if (count0 >=2) {
//至少有2个零
//add your code
break;
}
if (count1 >=2) {
//至少有2个1
//add your code
break;
}
}
chenjie1981 2003-09-13
  • 打赏
  • 举报
回复
temp[0],temp[1],temp[2],temp[3]任选2个有4*3种组合方法,01,10,02,20,03,30,12,21,13,31,23,32,你考虑这12种情况就行了,不过麻烦了点,分解字符我不赞成,绝对比正向的难实现。
xxsteven 2003-09-13
  • 打赏
  • 举报
回复
没有人说话了,啊?
xxsteven 2003-09-13
  • 打赏
  • 举报
回复
Yssss1980(浪子雪影),如何实现呢?
dragonlw 2003-09-13
  • 打赏
  • 举报
回复
呵呵,我认同第一个人的想法
还有更好的算法么?更高效率
比较几次?占几个存储单元?
Yssss1980 2003-09-13
  • 打赏
  • 举报
回复
我观察了一下你的数组,好像可以反过来思考

你可以把数组中的字符串分解开来,然后和temp[0],temp[1],temp[2],temp[3]比较

这样是不是有效率一点?
xxsteven 2003-09-13
  • 打赏
  • 举报
回复
大家请看我要实现的东西?如下:
先定义3个数组:
const char * dosuit [ 16 ] = { "01","23","45","67","89","1011","1213","1415","1617","1819",\
"2021","2223","2425","2627","2829","3031" };
const char * redosuit [ 16 ] = { "10","32","54","76","98","1110","1312","1514","1716","1918",\
"2120","2322","2524","2726","2928","3130" };
int temp [32];

temp[0],temp[1],temp[2],temp[3]的取值分别是从0到31同时它是随机得到的0到31其中的一个数字。
我想实现的是如果temp[0],temp[1],temp[2],temp[3]中任意2个组合起来值等于dosuit或redosuit2个数组里面任意一个成员就printf.....。
比如:
temp[0] = 0;
temp[1] = 1;
sprintf ( str1,"%d%d",temp[0],temp[1] );
if ( ( strcmp ( str1,dosuit[0] ) == 0 ) || ( strcmp ( str1,redosuit[0] ) == 0 ) )
printf ( "--------有相对应的值---------\n" );


我只能实现这2个但不知道如何实现temp[0],temp[1],temp[2],temp[3]随意排列的对应
xxsteven 2003-09-13
  • 打赏
  • 举报
回复
谁有更好的算法?
csdn5211 2003-09-13
  • 打赏
  • 举报
回复
楼上的思路是依次判断并用一个变量记录结果,不过我还没想到更有效率的算法。
Yssss1980 2003-09-13
  • 打赏
  • 举报
回复
int count0=0,count1=0;

if(i==0) count0++;
else if(i==1) count1++;

if(j==0) count0++;
else if(j==1) count1++;

if(k==0) count0++;
else if(k==1) count1++;

if(l==0) count0++;
else if(l==1) count1++;

if(count0==2) {printf("有两个0");}
if(count1==2) {printf("有两个1");}
xxsteven 2003-09-13
  • 打赏
  • 举报
回复
说话呀

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧