八皇后问题

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在国际象棋棋盘8行8列上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,求有多少种摆放方法。

#include <stdio.h>
int iCount = 0;//已经放了多少的皇后
int Queens[8];//皇后放的行数,每个皇后必然占据一列,Queens[5]为第5列皇后放置的行数。

int IsValid(int n)//断第n个皇后是否与前面皇后行成攻击
{
   int i;
   for (i = 0; i < n; i++)//第n个皇后与前面n-1个皇后比较 
   {
       if (Queens[i] == Queens[n])//两个皇后在同一行上,返回0。
         return 0;
       if (abs(Queens[i] - Queens[n]) == (i - n))//两个皇后在同一对角线上,返回0。
         return 0;
   }
   return 1;//没有冲突,返回1。
}

//依次从第0列第一列第二列确定每列皇后放置的行数。
void Queen(int n)//求第n列中哪行放置皇后
{
   int i;
   if (n == 8)//第8列排完则8个皇后已放置完成
   {
      return;
   }
   for (i = 1; i <= 8; i++)//对第n列的每行上循环,从第一行开始。每列都是从0行开始检测
   { 
      Queens[n] = i;//假设第n列上放置在第i行 
      if (IsValid(n))//没有冲突,就开始下一列的试探
         Queen(n + 1); //递归调用进行下一步 
   }
}
int main()
{ 
   printf("八皇后排列方案:\n"); 
   Queen(0);//从第0列开始递归试探 
   getch();
   return 0;
}

 

 

我们将棋盘看作是一个8*8的数组,这样可以使用一种蛮干的思路去解决这个问题,这样我们就是在8*8=64个格子中取出8个的组合,C(64,80) = 4426165368,显然这个数非常大,在蛮干的基础上我们可以增加回溯,从第0列开始,我们逐列进行,从第0行到第7行找到一个不受任何已经现有皇后攻击的位置,而第五列,我们会发现找不到皇后的安全位置了,前面四列的摆放如下:

image

第五列的时候,摆放任何行都会上图所示已经存在的皇后的攻击,这时候我们认为我们撞了南墙了,是回头的时候了,我们后退一列,将原来摆放在第四列的皇后(3,4)拿走,从(3,4)这个位置开始,我们再第四列中寻找下一个安全位置为(7,4),再继续到第五列,发现第五列仍然没有安全位置,回溯到第四列,此时第四列也是一个死胡同了,我们再回溯到第三列,这样前进几步,回退一步,最终直到在第8列上找到一个安全位置(成功)或者第一列已经是死胡同,但是第8列仍然没有找到安全位置为止。

 

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 在 Linux 中,处理大文件时,尤其是像日志文件这样内容繁多的文件,可能会遇到查找关键字时显示内容过多的情况。例如,对于一个很大的日志文件 info.log,我们想查看包含某段字符(如“1711178968”)的所有日志内容,可以使用命令 cat info.log | grep ‘1711178968’。但如果返回的结果太多,超出了屏幕显示范围,就很难一次性查看完整。 此时,可以通过以下几种方法来解决: 增加时间或行数限制:如果知道日志中包含关键字的时间范围,可以在 grep 命令中加入时间条件,缩小搜索范围,从而减少输出内容。或者,也可以通过限制输出的行数来逐步查看结果。 暂存中间结果:可以使用重定向操作符 >> 将查找结果暂存到一个临时文件中。例如,执行命令 cat info.log | grep ‘1711178968’ >> temp.log,将匹配到的内容保存到 temp.log 文件中。然后,使用 more 或 less 等工具逐页查看 temp.log 文件。more 和 less 都支持分页显示,方便用户逐屏查看文件内容。 按时间截取日志:如果明确知道需要查看的日志时间范围,可以使用 sed 命令来截取特定时段的日志内容。例如,使用命令 sed -n /2 可以截取从指定时间开始到结束时间之间的日志内容。通过这种方式,可以直接定位到目标时间段的日志,避免不必要的内容干扰。 总之,通过这些方法,可以有效解决在处理大文件时查找关键字内容过多的问题,方便用户更高效地查看和分析日志文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值