/*问题描述:N*N的棋盘,从棋盘中的某个格开始,是否存在经过棋盘上所有格一次且仅一次的通路!
*/
//回溯方式
- #include<iostream>
- using namespace std;
- #define N 8 //N*N的棋盘
- int Roads[N*N];//存储走的方式
- int count=0;//存储共有几种走的方式
- bool visited[N+2][N+2];//加边界,便于处理,记录访问过的格
- int main(){
- void Init();//初始化
- void Hoof(int steps,int x,int y);
- Init();
- int Start_x,Start_y;
- cout<<"输入起始位置(x,y)(1<=x<=8,1<=y<=8)!"<<endl;
- cin>>Start_x>>Start_y;
- Roads[0]=0;//起始点
- visited[Start_x][Start_y]=true;
- Hoof(1,Start_x,Start_y);
- if(count==0)cout<<"不存在通过所有格一次且仅一次的途径!"<<endl;
- return 0;
- }
- void Init(){
- for(int i=0;i<N+2;i++){/*边界初始化*/
- visited[0][i]=true;
- visited[N+1][i]=true;
- visited[i][0]=true;
- visited[i][N+1]=true;
- }
- for(i=1;i<=N;i++){/*棋格初始化*/
- for(int j=1;j<=N;j++)visited[i][j]=false;
- }
- }
- void Hoof(int steps,int x,int y){
- if(steps==N*N){/* 输出此次结果*/
- cout<<"第"<<count+1<<"种方式为:"<<endl;
- for(int i=1;i<=N*N;i++){
- switch(Roads[i]){
- case 1:cout<<"上";break;
- case 2:cout<<"下";break;
- case 3:cout<<"左";break;
- case 4:cout<<"右";break;
- }
- }
- count++;
- cout<<endl;
- return ;
- }
- else{
- bool temp=false;//判断是否四路都不通
- for(int i=1;i<=4;i++){/*1~4分表代表上,下,左,右的前进方向*/
- switch(i){
- case 1:/*往上*/
- if(!visited[x-1][y]){
- Roads[steps]=1;
- visited[x-1][y]=true;
- temp=true;
- Hoof(steps+1,x-1,y);
- visited[x-1][y]=false;
- }break;
- case 2:/*往下*/
- if(!visited[x+1][y]){
- Roads[steps]=2;
- visited[x+1][y]=true;
- temp=true;
- Hoof(steps+1,x+1,y);
- visited[x+1][y]=false;
- }break;
- case 3:/*往左*/
- if(!visited[x][y-1]){
- Roads[steps]=3;
- visited[x][y-1]=true;
- temp=true;
- Hoof(steps+1,x,y-1);
- visited[x][y-1]=false;
- }break;
- case 4:/*往右*/
- if(!visited[x][y+1]){
- Roads[steps]=4;
- visited[x][y+1]=true;
- temp=true;
- Hoof(steps+1,x,y+1);
- visited[x][y+1]=false;
- }break;
- }
- }//end_for
- if(!temp)return;//四个方向都不通,回走一步
- }
- }