高考数学最后两道大题题

当前位置:
>>>在下面方框里填上《三国演义》中两个字的人物名字,使前四个字和后..
在下面方框里填上《三国演义》中两个字的人物名字,使前四个字和后四个字各成一条成语。这道题有点难度,你要有信心噢!&&1.千疮百□& □目张胆&2.咬紧牙□& □扇纶巾&3.纲举目□& □针走线&4.指鹿为□& □群出众&5.完璧归□& □消雾散&6.孝子贤□& □宜之计&7.九鼎大□& □在鼓里&8.黄钟大□& □衣蔬食
题型:填空题难度:中档来源:同步题
1.孔明&&2.关羽& 3.张飞&&4.马超& 5.赵云& 6.孙权& &7.吕蒙& 8.吕布
马上分享给同学
据魔方格专家权威分析,试题“在下面方框里填上《三国演义》中两个字的人物名字,使前四个字和后..”主要考查你对&&成语&&等考点的理解。关于这些考点的“档案”如下:
现在没空?点击收藏,以后再看。
因为篇幅有限,只列出部分考点,详细请访问。
成语:是我国汉字语言词汇中一部分定型的词组或短句。成语有固定的结构形式和固定的说法,表示一定的意义,在语句中是作为一个整体来应用的。成语有很大一部分是从古代相承沿用下来的,在用词方面往往不同于现代汉语。它代表了一个故事或者典故。成语又是一种现成的话,跟习用语、谚语相近,但是也略有区别。成语特点:1、成语是我国语言词汇中一部分定型的词组或短句。有固定的结构形式和固定的说法,表示一定的意义,在语句中是作为一个整体来应用的。 2、一般为四个字,也有不规则的如“五十步笑百步”、“欲速则不达”、“醉翁之意不在酒”,不过这种比较少。 3、学习成语的过程中,应该注意:①正确书写。②正确理解成语的意思,从而正确地使用。③弄清成语的感情色彩。 不同成语列举一、含有动物名称的成语万象更新& & 抱头鼠窜 鸡鸣狗盗 千军万马 亡羊补牢 杯弓蛇影 鹤立鸡群 对牛弹琴如鱼得水 鸟语花香 为虎作伥 黔驴技穷 画龙点睛 抱头鼠窜 虎背熊腰 守株待兔鹤发童颜&& &狗急跳墙 鼠目寸光 盲人摸象 画蛇添足二、含有两个动物名称的成语鹤立鸡群 鸡鸣狗盗 鹬蚌相争 蚕食鲸吞 蛛丝马迹 龙争虎斗 龙腾虎跃 龙骧虎步 龙潭虎穴 龙跃凤鸣 车水马龙 指鹿为马 心猿意马 狼吞虎咽& 龙马精神 龙飞凤舞 兔死狐悲 鸡犬不宁三、含有人体器官的成语眼高手低 目瞪口呆 胸无点墨 头重脚轻 手足轻深 口是心非 手疾眼快 耳闻目睹 头破血流 眉清目秀 袖手傍观 口出不逊 手疾眼快四、含有昆虫名称的成语:飞蛾扑火 金蝉脱壳 积蚊成雷 蟾宫折挂& 蜻蜓点水 螳臂挡车 蛛丝马迹 蚕食鲸吞五、含有一组近义词的成语见多识广 察言观色 高瞻远瞩 左顾右盼 调兵遣将 粉身碎骨 狂风暴雨 旁敲侧击千辛万苦 眼疾手快 生龙活虎 惊天动地 七拼八凑 胡言乱语 改朝换代 道听途说六、含有一组反义词的成语千呼后拥 东倒西歪 眼高手低 口是心非 头重脚轻 有头无尾 前倨后恭 东逃西散南辕北辙 左顾右盼 积少成多 同甘共苦 半信半疑 大材小用 先人后己 有口无心由此及彼 天经地义 弄假成真 举足轻重 南腔北调 声东击西 转危为安 东倒西歪反败为胜 以少胜多七、多字格成语螳螂捕蝉,黄雀在后&&&&&& 手无缚鸡之力&&&&&&&&&&&&& 千军易得,一将难求&&&&&&&千里之行,始于足下&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&宁为鸡首,无为牛后&&&&&&&一年之计在于春&&&天时地利人和& 急来抱佛脚&&& 静如处女,动如脱兔&&&&&& 解铃还须系铃人& &化干戈为玉帛& 习惯成自然麻雀虽小,五脏俱全&&&&&& 三人行必有我师&& 九牛二虎之力 久旱逢干雨人无远虑,必有近忧&&&&&& 人不可貌相八、描写情况紧急的成语千钧一发 刻不容缓 迫不及待 十万火急 火烧眉毛 燃眉之急九、描写人物神态的成语心旷神怡 心平气和 目不转睛 呆若木鸡 眉开眼笑 愁眉苦脸 愁眉紧锁 目瞪口呆 垂头丧气 嬉皮笑脸十、描写英雄人物的成语一身正气 临危不惧 光明磊落 堂堂正正 大智大勇 力挽狂澜 急中生智 仰不愧天 镇定自若 化险为夷十一、描写春天美好的成语春光明媚 万紫千红 春雨如油 生机勃勃 春色满圆 春意盎然 鸟语花香 春暖花开& 百花齐放 和风细雨十二、“想”的成语苦苦地想(苦思冥想)& 静静地想(静思默想)& 想得周全(深思熟虑) 想得混乱(胡思乱想) 想得厉害(浮想联翩) 想得很多(左思右想)想得荒唐(痴心妄想) 想得离奇(异想天开) 想了又想(朝思暮想)十三、“多”的成语观众多(座无虚席)贵宾多(高朋满座)人很多(摩肩接踵)人才多(人才济济)兵马多(千军万马)事物多(林林总总)色彩多(五彩缤纷)类别多(千差万别)困难多(千辛万苦)话儿多(滔滔不绝)读书多(博览群书)见识多(见多识广)变化多(千变万化)走得多(走南闯北)颜色多(五颜六色)花样多(五花八门)十四、带有“看”的近义词的成语见多识广 望而生畏 察言观色 一视同仁 一览无余 高瞻远瞩 坐井观天 举世瞩目 管中窥豹 左顾右盼十五、带有“龙”字的成语生龙活虎 龙争虎斗 龙马精神 龙飞凤舞 龙腾虎跃 龙骧虎步 画龙点睛 龙潭虎穴& 龙跃凤鸣 车水马龙十六、源自于寓言故事的成语鹬蚌相争 刻舟求剑 鹏程万里 守株待兔 掩耳盗铃 亡羊补牢 惊弓之鸟 杯弓蛇影& 抱薪救火十七、源自于历史故事的成语安步当车 暗渡陈仓 按图索骥 程门立雪 班门弄斧 兵不厌诈 三顾茅庐十八、首尾同字的成语微乎其微 神乎其神 天外有天 痛定思痛 数不胜数& 人外有人 防不胜防& 忍无可忍 闻所未闻 举不胜举十九、带有鸟类名称的成语欢呼雀跃 鸦雀无声 鹏程万里 一箭双雕 风声鹤唳 鹤发鸡皮&& 鹤发童颜 鹤立鸡群 麻雀虽小 五脏俱全 螳螂捕蝉 黄雀在后二十、成语接龙(“不”字开头)不耻下问 问道于盲 盲人瞎马 马到成功 功败垂成 成人之美 美不胜收 收回成命 命中注定 定时炸弹 弹尽粮绝 绝无仅有 有机可乘 乘机而入 入木三分 分秒必争&& 争权夺利 利欲熏心 心安理得 得意洋洋二十一、成语之最(一日三秋)最短的季节。 (一落千丈)落差最大的瀑布。(一字千金)最贵的稿酬。(一本万利)最赚钱的生意。(一手遮天)最大的手。   (一毛不拔)最吝啬的人。(一步登天)最长的脚。  (一日千里)跑得最快的马。 (一尘不染)最干净的地方。(一掷千金)最浪费的行为。(一文不值)最便宜的东西。 (一身是胆)胆最大的人。(千钧一发)最危险的时候。(羊肠小道)最狭窄的路。  (一目十行)最快的阅读。(天涯海角)最远的地方。 (无米之炊)最难做的饭。  (顶天立地)最高的个子。(十全十美)最完美的东西。(无可救药)最重的疾病。  (风驰电掣)最快的速度。(晴天霹雳)最反常的天气。(度日如年)最长的日子。  (一柱擎天)最长的棍子。(气吞山河)最大的嘴。  (一步登天)最长的腿。   (顶天立地)最高的人。(轻如鸿毛)最小的人。  (无孔不入)最尖的针。   (一言九鼎)最重的话。(金玉良言)最贵重的话。 (一览无余)最宽的视野。  (脱胎换骨)最大的手术。(包罗万象)最大的气量。 (天壤之别)最大的差异。  (天翻地覆)最大的变化。(无米之炊)最难做的饭。 (风驰电掣)最快的速度。  (取之不尽)最多的资源。(一日三秋)最短的季节。 (度日如年)最长的一天。  (无边无际)最大的地方。二十二、反义成语爱财如命——挥金如土 异口同声——众说纷纭 爱不释手——弃若敝屐半途而废——坚持不懈 一丝不苟——粗枝大叶 博古通今——坐井观天高瞻远瞩——鼠目寸光 寂然无声——鸦雀无声二十三、近义成语百发百中——百步穿杨; 急功近利——急于求成; 不求甚解——囫囵吞枣白日做梦——痴心妄想; 熙熙攘攘——熙来攘往; 博古通今——博古知今东倒西歪——东扶西倒; 不名一钱——一贫如洗二十四、含有夸张成分的成语怒发冲冠 一目十行 一日千里 一字千金 百发百中 一日三秋& 一步登天 千钧一发 不毛之地 不计其数 胆大包天 寸步难行二十五、三字俗语类(变色龙)立场不稳,见风使舵的人。(笑面虎)笑脸相迎,两面三刀的人。(地头蛇)强横无赖,称霸一方的人。(铁公鸡)一毛不拔,吝啬钱财的人。(哈巴狗)趋炎附势,百依百顺的人。(替罪羊)代人受过,替人挨揍的人。(井底蛙)孤陋寡闻、知识不广的人。(孺子牛)鞠躬尽瘁、为民造福的人。(千里马)得才兼备,大有作为的人。(纸老虎)比喻外强中干的人。二十六、含有比喻成分的成语观者如云 挥金如土 铁证如山 爱财如命 稳如泰山 门庭若市骨瘦如柴 冷若冰霜 如雷贯耳 守口如瓶 浩如烟海 高手如林二十七、数字成语一唱一和 一呼百应& 一干二净& 一举两得& 一落千丈 一模一样 一暴十寒 一日千里一五一十 一心一意& 两面三刀& 三长两短& 三番五次 三三两两 三头六臂 三心二意三言两语 四分五裂& 四面八方& 四通八达& 四平八稳 五光十色& 五湖四海 五花八门五颜六色 六神无主 七颠八倒& 七零八落& 七拼八凑 七上八下 七手八脚 七嘴八舌 八面玲珑& 九死一生 九牛一毛 十马九稳 十全十美& 百发百中& 百孔千疮 百战百胜 百依百顺& 千变万化& 千差万别& 千军万马& 千山万水 千丝万缕 千辛万苦 千言万语 千真万确&& 千锤百炼 千方百计 千奇百怪 千姿百态 千钧一发 千虑一得 千虑一失 千篇一律& &万水千山 万无一失 万众一心 万紫千红 万死一生二十八、描写友情的成语:推心置腹 肝胆相照 情同手足 志同道合 风雨同舟& 荣辱与共& 同甘共苦 关怀备注 心心相印 海誓山盟 拔刀相助 亲密无间& 二十九、描写花的成语:万紫千红 春暖花开 鸟语花香 姹紫嫣红 花红柳绿 百花争艳&& 锦上添花 火树银花 昨日黄花 春花秋月&花团锦簇 花枝招展三十、描写山的成语:崇山峻岭 山明水秀 山穷水尽 大好山河 刀山火海 地动山摇&& 高山深涧 悬崖峭壁 峰峦雄伟 漫山遍野 江山如画 锦绣山河三十一、描写颜色的成语五彩缤纷 五颜六色 一碧千里 万紫千红 花红柳绿&&& 姹紫嫣红 五光十色 青红皂白 绿水青山 翠色欲流三十二、表示稀少的成语不可多得 凤毛麟角 九牛一毛 绝无仅有 空前绝后 寥寥无几&& 寥若晨星 宁缺毋滥前所未有 屈指可数 三三两两 铁树开花&& 微乎其微 一麟半爪 一丝一毫 百里挑一沧海一粟 千古绝唱三十三、描写热闹繁华的成语摩肩接踵 车水马龙 川流不息 纷至沓来 花花世界 举袖为云 挥汗如雨& 人山人海络绎不绝 门庭若市 万人空巷 水泄不通 人声鼎沸 人欢马叫& 震耳欲聋 座无虚席三十四、描写丰富繁多的成语包罗万象 琳琅满目 美不胜收 目不暇接 无奇不有 无穷无尽 无所不包& 丰富多彩五花八门 眼花缭乱 洋洋大观 一应俱全 应有尽有 应接不暇 比比皆是& 星罗棋布不可计数 层出不穷 绰绰有余 多多益善 多如牛毛 俯拾皆市 举不胜举& 漫山遍野三十五、含有“云”字的成语九霄云外 腾云驾雾 壮志凌云 风云变幻 风起云涌 行云流水& 风卷残云 浮云蔽日 孤云野鹤 烘云托月 过眼云烟 烟消云散三十六、含有“雨”字的成语大雨倾盆 血雨腥风 风雨交加 风调雨顺 枪林弹雨 风雨同舟 风雨无阻和风细雨 狂风暴雨 满城风雨 滂沱大雨 春风化雨 风雨飘摇 斜风细雨三十七、含有“水”字的成语水流湍急 水平如镜 高山流水 千山万水 水滴石穿&&& 滴水不漏 杯水车薪 洪水猛兽 流水无情 水乳交融三十八、描写说的成语直言不讳 无所顾忌 拐弯抹角 真心诚意 故弄玄虚 侃侃而谈 滔滔不绝& 闲言碎语虚情假意 推心置腹 旁敲侧击 喋喋不休 慢条斯理 含糊其词 唠唠叨叨& 自圆其说振振有辞 肆无忌惮 大言不惭 娓娓动听 绘声绘色 对答如流三十九、描写人的容貌或体态的成语闭月羞花 沉鱼落雁 出水芙蓉 明眸皓齿 美如冠玉 倾国倾城 国色天香 弱不禁风鹤发童颜 眉清目秀 和蔼可亲 心慈面善 张牙舞爪 愁眉苦脸 冰清玉洁 蓬头垢面雍容华贵 文质彬彬 威风凛凛 老态龙钟 虎背熊腰 如花似玉 容光焕发& 其貌不扬落落大方 骨瘦如柴 大腹便便& 面黄肌瘦四十、描写人的语言的成语口若悬河 对答如流 滔滔不绝 谈笑风生 高谈阔论 豪言壮语 夸夸其谈 花言巧语四十一、描写人心理活动的成语忐忑不安 心惊肉跳 心神不定 心猿意马 心慌意乱 七上八下 心急如焚四十二、描写骄傲的成语班门弄斧 孤芳自赏 居功自傲 目中无人 妄自尊大 忘乎所以 自鸣得意 自我陶醉 自命不凡 目空一切 惟我独尊 自高自大 四十三、描写谦虚的成语不骄不躁 功成不居 戒骄戒躁 洗耳恭听 虚怀若谷 慎言谨行四十四、描写学习的成语学无止境 学而不厌 真才实学 学而不倦 发奋图强 废寝忘食 争分夺秒 孜孜不倦笨鸟先飞 闻鸡起舞 自强不息 只争朝夕 不甘示弱 全力以赴 力争上游 披荆斩棘四十五、描写人物品质的成语奋不顾身 舍己为人 坚强不屈 赤胆忠心 不屈不挠 忠贞不渝 誓死不二威武不屈 舍死忘生 肝胆相照 克己奉公 一丝不苟 两袖清风 见礼忘义永垂不朽 顶天立地 豁达大度 兢兢业业 卖国求荣 恬不知耻 贪生怕死 四十六、描写人物神态的成语神采奕奕 眉飞色舞 昂首挺胸 惊慌失措 漫不经心 垂头丧气 没精打采&& 愁眉苦脸 大惊失色 炯炯有神小学常用成语集锦:&一、描写人的品质:平易近人 宽宏大度  冰清玉洁  持之以恒  锲而不舍  废寝忘食  && 大义凛然 临危不俱  光明磊落  不屈不挠  鞠躬尽瘁  死而后已二、描写人的智慧:&料事如神  足智多谋  融会贯通  学贯中西  博古通今   &&& 出类拔萃  博大精深  集思广益  举一反三&&&&&&&& 才华横溢三、描写人物仪态、风貌:憨态可掬  文质彬彬  风度翩翩  相貌堂堂  落落大方&   &&& 意气风发  威风凛凛  容光焕发  神采奕奕&&&&&&& 斗志昂扬四、描写人物神情、情绪:悠然自得  眉飞色舞 && 喜笑颜开 &&&& 神采奕奕  欣喜若狂   &&&& 喜出望外  垂头丧气  无动于衷  勃然大怒&&&&& 呆若木鸡五、描写人的口才:能说会道  巧舌如簧  能言善辩  滔滔不绝  伶牙俐齿   &&& 语惊四座  娓娓而谈  妙语连珠  口若悬河&&&&&&& 出口成章六、来自历史故事的成语:三顾茅庐  铁杵成针  望梅止渴  完璧归赵  四面楚歌&  负荆请罪  精忠报国  手不释卷  悬梁刺股  凿壁偷光七、描写人物动作:走马观花  欢呼雀跃  扶老携幼  手舞足蹈  促膝谈心 前俯后仰  奔走相告  跋山涉水  前赴后继  张牙舞爪八、描写人间情谊:恩重如山  深情厚谊  手足情深  形影不离  血浓于水 志同道合 &&& 风雨同舟  赤诚相待  肝胆相照  生死相依九、说明知事晓理方面:循序渐进  日积月累  温故知新  勤能补拙  笨鸟先飞&&&  学无止境 && &学海无涯  滴水穿石  发奋图强  开卷有益十、来自寓言故事的成语:自相矛盾  滥竽充数  画龙点睛  刻舟求剑  守株待兔&&& 叶公好龙  亡羊补牢  画蛇添足  掩耳盗铃  买椟还珠
nngyinxn&""
Zdic.net --
发现相似题
与“在下面方框里填上《三国演义》中两个字的人物名字,使前四个字和后..”考查相似的试题有:
13551169743655493642920238643前阵参加了小米笔试,最后俩编程题一直没上机试试,今天下午闲着没事,实现了下。
第一题题目大题如下:有个字符串,连续两个空格以上,按一个空格算,求出处理后的字符串长度。我的方法是统计多余空格数,最后总长的减去多余空格数即可。
#include &stdio.h&
#include &string.h&
int del_blank(char a[])
int i, flag = 0, count = 0;
for (i = 0; i & strlen(a); i++)
if (a[i] == '*')
return strlen(a) -
int main(void)
char *a = "abc****abc**abc*ab";
printf("length = %d\n%s\n %d", strlen(a), a, del_blank(a));
第二个题目,一条直线有n个线段,知道首尾坐标,求线段总长度,重叠部分按一次算 struct s{}.
我将各个结构体元素按start从小到大排序,然后分 重合 相交 相离 三种情况考虑。
#include &stdio.h&
typedef struct node
void sort_s(int n, S a[])
for (i = 1; i & i++)
int tstart = a[i].start, tend = a[i].
for (j = j & 0 && a[j - 1].start & j--)
a[j].start = a[j - 1].
a[j].end = a[j - 1].
a[j].start =
a[j].end =
int calculateS(int n, S a[])
int result = a[0].end - a[0].
for (i = 1; i & i++)
if (a[i].end &= a[i - 1].end)
if (a[i].start &= a[i - 1].end)
result += a[i].end - a[i - 1].
result += a[i].end - a[i].
int main(void)
S a[]={{1, 2}, {2, 5}, {3, 4}, {6, 9}, {1, 2}};
sort_s(5, a);
result = calculateS(5, a);
printf("\n%d ", result);
题目二问题已改正如下
int calculateS(int n, S a[])
int result = a[0].end - a[0].start, max_end = a[0].
for (i = 1; i & i++)
if (a[i].end &= max_end)
if (a[i].start &= max_end)
result += a[i].end - max_
result += a[i].end - a[i].
max_end = a[i].
程序有所不足,希望大家多提建议,共同学习进步!
阅读(...) 评论()25810人阅读
&&&&&&& N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。
一、&求解N皇后问题是算法中回溯法应用的一个经典案例
&&&&&& 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。
&&&&& 在现实中,有很多问题往往需要我们把其所有可能穷举出来,然后从中找出满足某种要求的可能或最优的情况,从而得到整个问题的解。回溯算法就是解决这种问题的“通用算法”,有“万能算法”之称。N皇后问题在N增大时就是这样一个解空间很大的问题,所以比较适合用这种方法求解。这也是N皇后问题的传统解法,很经典。
&&&&& 下面是算法的高级伪码描述,这里用一个N*N的矩阵来存储棋盘:
&&&&&&1) 算法开始, 清空棋盘,当前行设为第一行,当前列设为第一列
&&&&&&2) 在当前行,当前列的位置上判断是否满足条件(即保证经过这一点的行,列与斜线上都没有两个皇后),若不满足,跳到第4步
&&&&&&3) 在当前位置上满足条件的情形:
&&&&&&&&&&&&&&&&&在当前位置放一个皇后,若当前行是最后一行,记录一个解;
&&&&&&&&&&&&&&&& 若当前行不是最后一行,当前行设为下一行, 当前列设为当前行的第一个待测位置;
&&&&&&&&&&&&&&&& 若当前行是最后一行,当前列不是最后一列,当前列设为下一列;
&&&&&&&&&&&&&&&&&若当前行是最后一行,当前列是最后一列,回溯,即清空当前行及以下各行的棋盘,然后,当前行设为上一行,当前列设为当前行的下一个待测位置;
&&&&&&&&&&&&&&& 以上返回到第2步
&&&&& 4) 在当前位置上不满足条件的情形:
&&&&&&&&&&&&&&& 若当前列不是最后一列,当前列设为下一列,返回到第2步;
&&&&&&&&&&&&&&& 若当前列是最后一列了,回溯,即,若当前行已经是第一行了,算法退出,否则,清空当前行及以下各行的棋盘,然后,当前行设为上一行,当前列设为当前行的下一个待测位置,返回到第2步;&
&&&&&&& 算法的基本原理是上面这个样子,但不同的是用的数据结构不同,检查某个位置是否满足条件的方法也不同。为了提高效率,有各种优化策略,如多线程,多分配内存表示棋盘等。
&&&&&&&&在具体解决该问题时,可以将其拆分为几个小问题。首先就是在棋盘上如何判断两个皇后是否能够相互攻击,在最初接触这个问题时,首先想到的方法就是把棋盘存储为一个二维数组,然后在需要在第i行第j列放置皇后时,根据问题的描述,首先判断是在第i行是否有皇后,由于每行只有一个皇后,这个判断也可以省略,然后判断第j列是否有皇后,这个也很简单,最后需要判断在同一斜线上是否有皇后,按照该方法需要判断两次,正对角线方向和负对角线方向,总体来说也不难。但是写完之后,总感觉很笨,因为在N皇后问题中这个函数的使用次数太多了,而这样做效率较差,个人感觉很不爽。上网查看了别人的实现之后大吃一惊,大牛们都是使用一个一维数组来存储棋盘,在某个位置上是否有皇后可以相互攻击的判断也很简单。具体细节如下:
&&&&&&& 把棋盘存储为一个N维数组a[N],数组中第i个元素的值代表第i行的皇后位置,这样便可以把问题的空间规模压缩为一维O(N),在判断是否冲突时也很简单,首先每行只有一个皇后,且在数组中只占据一个元素的位置,行冲突就不存在了,其次是列冲突,判断一下是否有a[i]与当前要放置皇后的列j相等即可。至于斜线冲突,通过观察可以发现所有在斜线上冲突的皇后的位置都有规律即它们所在的行列互减的绝对值相等,即|
row – i | = | col – a[i] | 。这样某个位置是否可以放置皇后的问题已经解决。
&&&&&& 下面要解决的是使用何种方法来找到所有的N皇后的解。上面说过该问题是回溯法的经典应用,所以可以使用回溯法来解决该问题,具体实现也有两个途径,递归和非递归。递归方法较为简单,大致思想如下:
&&&& void queen(int row)
&&&&&&&&&&&& &if (n == row)&&&&& //如果已经找到结果,则打印结果
&&&&&&&&&&&&&&&&&&& print_result();
&&&&&&&&&&&& &else {
&&&&&&&&&&&&&&&&&&&&&&&& &for (k=0 to N) { //试探第row行每一个列
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &if (can_place(row, k) {&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& place(row, k);&& //放置皇后
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& queen(row + 1);& //继续探测下一行
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &}
&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&}
&&&&&&& 该方法由于在探测第i行后,如果找到一个可以放置皇后的位置j后,则会递归探测下一行,结束后则会继续探测i行j+1列,故可以找到所有的N皇后的解。
&&&&&&&&但是一般来说递归的效率比较差,下面重点讨论一下该问题的非递归实现。
&&&&&&& 非递归方法的一个重要问题时何时回溯及如何回溯的问题。程序首先对N行中的每一行进行探测,寻找该行中可以放置皇后的位置,具体方法是对该行的每一列进行探测,看是否可以放置皇后,如果可以,则在该列放置一个皇后,然后继续探测下一行的皇后位置。如果已经探测完所有的列都没有找到可以放置皇后的列,此时就应该回溯,把上一行皇后的位置往后移一列,如果上一行皇后移动后也找不到位置,则继续回溯直至某一行找到皇后的位置或回溯到第一行,如果第一行皇后也无法找到可以放置皇后的位置,则说明已经找到所有的解程序终止。如果该行已经是最后一行,则探测完该行后,如果找到放置皇后的位置,则说明找到一个结果,打印出来。但是此时并不能再此处结束程序,因为我们要找的是所有N皇后问题所有的解,此时应该清除该行的皇后,从当前放置皇后列数的下一列继续探测。
完整的代码如下:
* 回溯法解N皇后问题
* 使用一个一维数组表示皇后的位置
* 其中数组的下标表示皇后所在的行
* 数组元素的值表示皇后所在的列
* 这样设计的棋盘,所有皇后必定不在同一行,于是行冲突就不存在了
* author: liuzhiwei
#include &stdio.h&
#include &stdlib.h&
#include &math.h&
#define QUEEN 8
//皇后的数目
#define INITIAL -10000
//棋盘的初始值
int a[QUEEN];
//一维数组表示棋盘
void init()
//对棋盘进行初始化
for (p = p & a + QUEEN; ++p)
*p = INITIAL;
int valid(int row, int col)
//判断第row行第col列是否可以放置皇后
for (i = 0; i & QUEEN; ++i)
//对棋盘进行扫描
if (a[i] == col || abs(i - row) == abs(a[i] - col))
//判断列冲突与斜线上的冲突
void print()
//打印输出N皇后的一组解
for (i = 0; i & QUEEN; ++i)
for (j = 0; j & QUEEN; ++j)
if (a[i] != j)
//a[i]为初始值
printf(&%c &, '.');
//a[i]表示在第i行的第a[i]列可以放置皇后
printf(&%c &, '#');
printf(&\n&);
for (i = 0; i & QUEEN; ++i)
printf(&%d &, a[i]);
printf(&\n&);
printf(&--------------------------------\n&);
void queen()
//N皇后程序
int n = 0;
int i = 0, j = 0;
while (i & QUEEN)
while (j & QUEEN)
//对i行的每一列进行探测,看是否可以放置皇后
if(valid(i, j))
//该位置可以放置皇后
//第i行放置皇后
//第i行放置皇后以后,需要继续探测下一行的皇后位置,所以此处将j清零,从下一行的第0列开始逐列探测
//继续探测下一列
if(a[i] == INITIAL)
//第i行没有找到可以放置皇后的位置
if (i == 0)
//回溯到第一行,仍然无法找到可以放置皇后的位置,则说明已经找到所有的解,程序终止
//没有找到可以放置皇后的列,此时就应该回溯
j = a[i] + 1;
//把上一行皇后的位置往后移一列
a[i] = INITIAL;
//把上一行皇后的位置清除,重新探测
if (i == QUEEN - 1)
//最后一行找到了一个皇后位置,说明找到一个结果,打印出来
printf(&answer %d : \n&, ++n);
//不能在此处结束程序,因为我们要找的是N皇后问题的所有解,此时应该清除该行的皇后,从当前放置皇后列数的下一列继续探测。
//_sleep(600);
j = a[i] + 1;
//从最后一行放置皇后列数的下一列继续探测
a[i] = INITIAL;
//清除最后一行的皇后位置
//继续探测下一行的皇后位置
int main(void)
system(&pause&);
&&&&&&& 下面的代码跟上面的代码差不多,只是稍微做了一些变化。。上面函数判断棋盘某个位置合法性的时候,valid函数里面的QUEEN可以修改为row的,只需要将前面row行与第row行进行比较就可以了,不需要将所有行都与第row进行比较的。。。下面的代码中的check函数中循环次数是k而不是皇后的个数就是这个原因。。。
#include &iostream&
#include &cmath&
#define Max 20
//定义棋盘的最大值
int a[Max];
int show(int S)
//定义输出函数
int i,p,q;
int b[Max][Max]={0};
//定义并初始化b[][]输出数组
for(i=1;i&=S;i++)
//按横列i顺序输出a[i]数组坐标
b[i][a[i]]=1;
printf(&(%d,%d)\t&,i,a[i]);
printf(&\n&);
for(p=1;p&=S;p++)
//按棋盘的横列p顺序标明皇后的位置
for(q=1;q&=S;q++)
if(b[p][q]==1)
//在第p行第q列放置一个皇后棋子
printf(&●&);
printf(&○&);
printf(&\n&);
int check(int k)
//定义check函数
for(i=1;i&k;i++)
//将第k行与前面的第1~~k-1行进行判断
if((a[i]==a[k]) || (a[i]-a[k]==k-i) || (a[i]-a[k]==i-k))
//检查是否有多个皇后在同一条直线上
void check_m(int num)
//定义函数
int k=1,count=0;
printf(&The possible configuration of N queens are:\n&);
while(k&0)
if(k&=num && a[k]&=num)
//从第k行第一列的位置开始,为后续棋子选择合适位子
if(check(k)==0)
//第k行的a[k]列不能放置皇后
//继续探测当前行的下一列:a[k]+1
//第K行的位置已经确定了,继续寻找第k+1行皇后的位置
//从第一列开始查找
//若满足输出数组的要求则输出该数组
printf(&[%d]:
show(num);
//调用输出函数show()
//如果k&num会执行下面两行代码,因为虽然找到了N皇后问题的一个解,但是要找的是所有解,需要回溯,从当前放置皇后的下一列继续探测
//如果a[k]&num也会执行下面两行代码,就是说在当前行没有找到可以放置皇后的位置,于是回溯,从上一行皇后位置的下一列继续探测
//棋子位置不符合要求,则退回前一步
//继续试探下一列位置
printf(&The count is: %d \n&,count);
int main(void)
//system(&color 2a&);
printf(&********************N皇后问题系统*********************\n\n&);
1. 四皇后问题
2. 八皇后问题
3. N 皇后问题(N&20)
printf(&******************************************************\n&);
printf(&\n
从数字1-4之间的数选择需要的操作\n\n&); /*提示输入选项*/
请输入你要选择的功能选项:__\n&);
scanf(&%d&,&d);
check_m(4);
//4皇后问题
check_m(8);
//8皇后问题
printf(&请输入N的值:_&);
fflush(stdin);
//清除缓冲
scanf(&%d&,&N);
printf(&\n&);
if(N&0&&N&20)
check_m(N);
//N皇后问题
printf(&输入错误,请从新输入:&);
printf(&\n\n&);
//程序结束
}while(1);
system(&pause&);
&&&&&&& 递归解法:
#include &stdio.h&
#include &stdlib.h&
const int N=20;
//最多放皇后的个数
//各皇后所在的行号
int cont = 0;
//统计解得个数
//输出一个解
void print(int n)
printf(&第%d个解:&,cont);
for(i=1;i&=n;i++)
printf(&(%d,%d) &,i,q[i]);
printf(&\n&);
for(i=1;i&=n;i++)
for(j=1;j&=n;j++)
if(q[i]!=j)
printf(&x &);
printf(&Q &);
printf(&\n&);
//检验第i行的k列上是否可以摆放皇后
int find(int i,int k)
while(j&i)
//j=1~i-1是已经放置了皇后的行
//第j行的皇后是否在k列或(j,q[j])与(i,k)是否在斜线上
if(q[j]==k || abs(j-i)==abs(q[j]-k))
//放置皇后到棋盘上
void place(int k,int n)
for(j=1;j&=n;j++)
//试探第k行的每一个列
if(find(k,j))
place(k+1,n);
//递归总是在成功完成了上次的任务的时候才做下一个任务
int main(void)
printf(&请输入皇后的个数(n&=20),n=:&);
scanf(&%d&,&n);
printf(&n值太大,不能求解!\n&);
printf(&%d皇后问题求解如下(每列的皇后所在的行数):\n&,n);
place(1,n);
//问题从最初状态解起
printf(&\n&);
system(&pause&);
&&& 二、使用位运算来求解N皇后的高效算法
&& 核心代码如下:
void test(int row, int ld, int rd)
if ( row != upperlim )
pos = upperlim & (~(row | ld | rd ));
while ( pos )
p = pos & (~pos + 1);
pos = pos -
test(row | p, (ld | p) && 1, (rd | p) && 1);
&&&&&&& 初始化: upperlim =& (1 && n)-1; Ans = 0;
&&&&&&& 调用参数:test(0, 0, 0);
&&&&&&&& 和普通算法一样,这是一个递归函数,程序一行一行地寻找可以放皇后的地方。函数带三个参数row、ld和rd,分别表示在纵列和两个对角线方向的限制条件下这一行的哪些地方不能放。位于该行上的冲突位置就用row、ld和rd中的1来表示。把它们三个并起来,得到该行所有的禁位,取反后就得到所有可以放的位置(用pos来表示)。
&&&&&&& p = pos & (~pos + 1)其结果是取出最右边的那个1。这样,p就表示该行的某个可以放子的位置,把它从pos中移除并递归调用test过程。
&&&&&&& 注意递归调用时三个参数的变化,每个参数都加上了一个禁位,但两个对角线方向的禁位对下一行的影响需要平移一位。最后,如果递归到某个时候发现row=upperlim了,说明n个皇后全放进去了,找到的解的个数加一。
&&&&&& &upperlime:=(1 && n)-1 就生成了n个1组成的二进制数。
&&&&&&&&这个程序是从上向下搜索的。
&&&&&&&&pos&& -pos 的意思就是取最右边的 1 再组成二进制数,相当于&pos &(~pos +1),因为取反以后刚好所有数都是相反的(怎么听着像废话),再加 1 ,就是改变最低位,如果低位的几个数都是1,加的这个 1 就会进上去,一直进到 0 ,在做与运算就和原数对应的 1 重合了。举例可以说明:
&&&&&&& 原数 0 0 0 0 1 0 0 0&&& 原数 0 1 0 1 0 0 1 1
&&&&&&& 取反 1 1 1 1 0 1 1 1&&& 取反 1 0 1 0 1 1 0 0
&&&&&&& 加1&&& 1 1 1 1 1 0 0 0&&& 加1& 1 0 1 0 1 1 0 1
&&与运算&&& 0 0 0 0 1 0 0 0&&& and& 0 0 0 0 0 0 0 1
&&&&& 其中呢,这个取反再加 1 就是补码,and 运算 与负数,就是按位和补码与运算。
&&&&& &(ld | p)&& 1 是因为由ld造成的占位在下一行要右移一下;
&&&&& &(rd | p)&& 1 是因为由rd造成的占位在下一行要左移一下。
&&&&&& &ld rd row 还要和upperlime&与运算 一下,这样做的结果就是从最低位数起取n个数为有效位置,原因是在上一次的运算中ld发生了右移,如果不and的话,就会误把n以外的位置当做有效位。
&&&&&&& pos 已经完成任务了还要减去p 是因为?
&&&&&&& while 循环是因为?
&&&&&&& 在进行到某一层的搜索时,pos中存储了所有的可放位置,为了求出所有解,必须遍历所有可放的位置,而每走过一个点必须要删掉它,否则就成死循环啦!
&&&&&&&& 这个是目前公认N皇后的最高效算法。
完整的代码如下:
** 目前最快的N皇后递归解决方法
** N Queens Problem
** 试探-回溯算法,递归实现
#include &iostream&
#include &time.h&
// sum用来记录皇后放置成功的不同布局数;upperlim用来标记所有列都已经放置好了皇后。
long sum = 0, upperlim = 1;
// 试探算法从最右边的列开始。
void test(long row, long ld, long rd)
if (row != upperlim)
// row,ld,rd进行“或”运算,求得所有可以放置皇后的列,对应位为0,
// 然后再取反后“与”上全1的数,来求得当前所有可以放置皇后的位置,对应列改为1
// 也就是求取当前哪些列可以放置皇后
long pos = upperlim & ~(row | ld | rd);
while (pos)
// 0 -- 皇后没有地方可放,回溯
// 拷贝pos最右边为1的bit,其余bit置0
// 也就是取得可以放皇后的最右边的列
long p = pos & -
// 将pos最右边为1的bit清零
// 也就是为获取下一次的最右可用列使用做准备,
// 程序将来会回溯到这个位置继续试探
// row + p,将当前列置1,表示记录这次皇后放置的列。
// (ld + p) && 1,标记当前皇后左边相邻的列不允许下一个皇后放置。
// (ld + p) && 1,标记当前皇后右边相邻的列不允许下一个皇后放置。
// 此处的移位操作实际上是记录对角线上的限制,只是因为问题都化归
// 到一行网格上来解决,所以表示为列的限制就可以了。显然,随着移位
// 在每次选择列之前进行,原来N×N网格中某个已放置的皇后针对其对角线
// 上产生的限制都被记录下来了
test(row + p, (ld + p) && 1, (rd + p) && 1);
// row的所有位都为1,即找到了一个成功的布局,回溯
int main(int argc, char *argv[])
int n = 16;
if (argc != 1)
n = atoi(argv[1]);
tm = time(0);
// 因为整型数的限制,最大只能32位,
// 如果想处理N大于32的皇后问题,需要
// 用bitset数据结构进行存储
if ((n & 1) || (n & 32))
printf(& 只能计算1-32之间\n&);
printf(&%d 皇后\n&, n);
// N个皇后只需N位存储,N列中某列有皇后则对应bit置1。
upperlim = (upperlim && n) - 1;
test(0, 0, 0);
printf(&共有%ld种排列, 计算时间%d秒 \n&, sum, (int) (time(0) - tm));
system(&pause&);
&&&&&&& 上述代码还是比较容易看懂的,但我觉得核心的是在针对试探-回溯算法所用的数据结构的设计上。
&&&&&&& 程序采用了递归,也就是借用了编译系统提供的自动回溯功能。
&&&&&&& 算法的核心:使用bit数组来代替以前由int或者bool数组来存储当前格子被占用或者说可用信息,从这可以看出N个皇后对应需要N位表示。
&&&&&&&& 巧妙之处在于:以前我们需要在一个N*N正方形的网格中挪动皇后来进行试探回溯,每走一步都要观察和记录一个格子前后左右对角线上格子的信息;采用bit位进行信息存储的话,就可以只在一行格子也就是(1行×N列)个格子中进行试探回溯即可,对角线上的限制被化归为列上的限制。
&&&&&&&& 程序中主要需要下面三个bit数组,每位对应网格的一列,在C中就是取一个整形数的某部分连续位即可。&row用来记录当前哪些列上的位置不可用,也就是哪些列被皇后占用,对应为1。ld,rd同样也是记录当前哪些列位置不可用,但是不表示被皇后占用,而是表示会被已有皇后在对角线上吃掉的位置。这三个位数组进行“或”操作后就是表示当前还有哪些位置可以放置新的皇后,对应0的位置可放新的皇后。如下图所示的8皇后问题求解得第一步:
&&&&&&&&&&&&& row:&&&&&&&&& [ ][ ][ ][ ][ ][ ][ ][*]
&&&&&&&&&&&&& ld:&&&&&&&&&&&& [ ][ ][ ][ ][ ][ ][*][ ]
&&&&&&&&&&&&& rd:&&&&&&&&&&& &[ ][ ][ ][ ][ ][ ][ ][ ]
&&&&&&&&&&&&& --------------------------------------
&&&&&&&&&&& row|ld|rd:&&& [ ][ ][ ][ ][ ][ ][*][*]
&&&&&&& 所有下一个位置的试探过程都是通过位操作来实现的,这是借用了C语言的好处,详见代码注释。
&&&&&& 关于此算法,如果考虑N×N棋盘的对称性,对于大N来说仍能较大地提升效率!
&&&&&& 位操作--对优化算法有了个新的认识
  这个是在csdn找到的一个N皇后问题最快的算法,看了好一会才明白,这算法巧妙之处我认为有2个:
&&&&&& 1、以前都是用数组来描述状态,而这算法采用是的位来描述,运算速度可以大大提升,以后写程序对于描述状态的变量大家可以借鉴这个例子,会让你的程序跑得更快                        
&&&&&& 2、描述每行可放置的位置都是只用row,ld,rd这3个变量来描述,这样使得程序看起来挺简洁的。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2426274次
积分:26122
积分:26122
排名:第102名
原创:254篇
评论:2389条
文章:14篇
阅读:24164
文章:19篇
阅读:415070
(1)(9)(1)(2)(4)(2)(2)(9)(2)(9)(10)(19)(20)(16)(18)(2)(2)(19)(10)(61)(14)(30)

我要回帖

更多关于 面对最后两道数学题 的文章

 

随机推荐