简单搜索题!

 设有一个4*4的棋盘,用四个棋子布到格子中,要求满足以下条件:
      (1)任意两个棋子不在同一行和同一列上;
      试问有多少种棋局,编程把它们全部打印出来。 
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;


int n=4, m=4, used_line[12], Opt[5];
// n为行 m为列 used_line记录这列有没有棋子放置
void dfs(int deep)
{
if (deep>4) //为什是>4而不是等于4呢?---你是从1开始做的啊。。。
{
for (int i=1; i<=4; i++)
{
for (int j=1; j<=4; j++)
if (Opt[i]==j) printf("O");
else printf("X");
printf("\n");
}
printf("\n");
//打印方案
return; //这个时候就可以回溯啦。。。
}
for (int i=1; i<=4; i++) //你可一放当前行的第1,2,3,4个(先不管方案可不可行)
if (used_line[i]==false) //如果这行没有放过。。。
{
used_line[i]=true; //放了。。。
Opt[deep]=i;  //保存决策,这个可以不用还原,因为新的会覆盖上去。。。
dfs(deep+1); //进行下一层搜索。。。
used_line[i]=false; //还原成没放 。。。
}
}


int main()
{
memset(used_line, false, sizeof(used_line));
//初始化
dfs(1); //搜索开始
return 0; //加上把。。编程好习惯。。。
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值