暴力回溯法
by shine_rise 2019/2/25
========================================*/
#include <iostream>
#include <string>
using namespace std;
const int ROW = 5;
const int COLUMN = 5;
int sum = 0;//sum
表示第几种解法
int chess[ROW][COLUMN] = {0};
//
用于打印的函数
void print(){
for(int i=0;i<ROW;i++){
for(int j=0;j<COLUMN;j++){
cout<<chess[i][j]<<" ";
}
cout<<endl;
}
}
//
从
(x,y)
点依次访问其各个点,
tag
表明第几步
void visit(int x, int y, int tag){
chess[x][y] = tag;
if(tag == ROW*COLUMN){
++sum;
if(sum == 1){
cout<<"
其中一种解法为:
"<<endl;
print();
}
}
//
左上
if(x-2>=0&&y-1>=0&&chess[x-2][y-1]==0)
visit(x-2, y-1, tag+1);
//
上左
if(x-1>=0&&y-2>=0&&chess[x-1][y-2]==0)
visit(x-1, y-2, tag+1);
//
左下
if(x-2>=0&&y+1<COLUMN&&chess[x-2][y+1]==0)
visit(x-2, y+1, tag+1);
//
下左
if(x-1>=0&&y+2<COLUMN&&chess[x-1][y+2]==0)
visit(x-1, y+2, tag+1);
//
右上
if(x+2<ROW&&y-1>=0&&chess[x+2][y-1]==0)
visit(x+2, y-1, tag+1);
//
上右
if(x+1<ROW&&y-2>=0&&chess[x+1][y-2]==0)
visit(x+1, y-2, tag+1);
//
右下
if(x+2<ROW&&y+1<COLUMN&&chess[x+2][y+1]==0)
visit(x+2, y+1, tag+1);
//
下右
if(x+1<ROW&&y+2<COLUMN&&chess[x+1][y+2]==0)
visit(x+1, y+2, tag+1);
chess[x][y] = 0;
}
int main(){
int x, y;
visit(0, 0, 1);
cout<<"
一共有
"<<sum<<"
种解法
"<<endl;
getchar();