发个题目大家一起讨论
任意拿出黑白2色棋子共8个,排成一个圆圈,然后再两颗相同颜色棋子中间放一颗黑色旗子,在不同颜色棋子中间放一个白色旗子,放完后撤掉原先所放的棋子,再重复以上过程,放下一圈后,就拿走前一圈所放的棋子,这样重复下去,各棋子的颜色怎么变化 问题点数:10、回复次数:15Top
1 楼tangguohua1983(国华)回复于 2005-05-19 18:04:11 得分 0
偶是新手,想到用循环队列表示,但是每轮要删除前一轮放的,这个不知道怎么来做,请高手指教Top
2 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2005-05-19 18:07:16 得分 1
很晕啊, 是不是同事进行的啊?
加入有两个黑的。我再放一个黑的,是不是先不处理新的两个黑的连续啊?
Top
3 楼tangguohua1983(国华)回复于 2005-05-19 18:26:50 得分 0
加入有两个黑的。我再放一个黑的,是不是先不处理新的两个黑的连续啊?
对,先不处理Top
4 楼daidodo(火箭发射机)回复于 2005-05-19 19:28:08 得分 1
一般情况下,加一个子同时也可以减一个子(除了边界),用List可以实现。Top
5 楼SaiRose(Learning......)回复于 2005-05-19 19:45:08 得分 1
最后都会是黑色的棋子Top
6 楼tangguohua1983(国华)回复于 2005-05-19 20:56:46 得分 0
怎么实现呢?
哪位高手给说说思路Top
7 楼ltc_mouse(野地芳菲)回复于 2005-05-19 22:05:04 得分 0
验证了一下, SaiRose(Learning......) 说的果然是对的,呵呵~
void main()
{
_asm{
mov cl, 0xFF
first:
mov al, cl
mov ah, cl
start:
ror al, 1
xor al, ah
mov ah, al
test al,al
jnz start
dec cl
test cl,cl
jnz first
}
system("pause");
}Top
8 楼yesiloveyou(下意识的弯了一下腰,TMD,踩狗屎了)回复于 2005-05-19 22:58:29 得分 1
最后全是黑棋
Top
9 楼anyy0929()回复于 2005-05-20 07:52:58 得分 3
随便编的,没仔细去想,能行,全黑,只用了数组~~~#include<iostream.h>
void isert(int array[])
{
int temp=array[0];
for(int i=0;i<7;i++)
{
if((array[i]==1&&array[i+1]==1)||(array[i]==0&&array[i+1]==0))
array[i]=1;
else
array[i]=0;
}
if((array[7]==1&&temp==1)||(array[7]==0&&temp==0))
array[7]=1;
else
array[7]=0;
}
//4次时能达到全1,其他的情况没试;
//1表示黑色,0表示白色
void main()
{
int array[8]={0,1,1,0,1,0,0,1};
cout<<"输入循环的次数:";
int number;
cin>>number;
for(int n=0;n<=number;n++)
{
isert(array);
}
for(int j=0;j<8;j++)
cout<<array[j]<<" ";
}
Top
10 楼ltc_mouse(野地芳菲)回复于 2005-05-20 08:55:11 得分 0
设用0表示黑棋,1表示白棋,则可用unsigned char 表示8个棋子的情况
根据题意, (0,0)-->0, (1,1)-->0, (0,1)-->1, (1,0)-->1, 因而可用 异或 实现
这就是我上面验证时使用的规则
mov ah, al
ror al, 1
xor al, ah
用C写循环移位感觉不爽,干脆用ror了,^_^Top
11 楼tangguohua1983(国华)回复于 2005-05-20 20:04:54 得分 0
ltc_mouse(野地芳菲)::根据题意, (0,0)-->0, (1,1)-->0, (0,1)-->1, (1,0)-->1, 因而可用 异或 实现
二进制奇妙阿!学习了!
不过ltc_mouse(野地芳菲)的代码不是很懂,
刚刚学习c++,嵌入汇编语言还不会
看了一下不是很懂,能解释一下吗?
还有,运行时怎么看结果
再寄存器器里看?怎么看?
Top
12 楼ltc_mouse(野地芳菲)回复于 2005-05-20 20:18:20 得分 3
to tangguohua1983(国华) :
设当前方案为 a1a2a3a4a5a6a7a8 要插入新的棋子,需要查看ai ai+1,异或之后得到新的bi
整体操作,就是对a1a2...a8循环移位1位,然后进行异或。如下:
a1a2a3a4a5a6a7a8
^ a2a3a4a5a6a7a8a1
--------------------
b1b2b3b4b5b6b7b8
附:
unsigned char x = 0x39;
unsigned char y;
while( x )
{
y = (x<<1)|(x>>7);
x = x^y; ///一次插入操作后的值
}Top
13 楼tangguohua1983(国华)回复于 2005-05-21 10:13:32 得分 0
弄明白了,谢谢大家!
分不多,聊表谢意!Top
14 楼tangguohua1983(国华)回复于 2005-05-22 21:10:40 得分 0
怎么结贴阿
点饥“管理”,进来后,我给了分,但怎么确定呢,没有看见“结贴”2字啊
见笑Top
15 楼SaiRose(Learning......)回复于 2005-05-22 21:45:40 得分 0
ltc_mouse(野地芳菲) :很棒的算法!!!学习
你的汇编不错啊Top




