⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 跳马问题非递归.cpp

📁 跳马问题
💻 CPP
字号:
/*
*思路是,马按要求不断向前跳,跳到头或跳到不能跳的地方,则回跳。
*马能跳到的地方,标记为1。输出标记为1的点的坐标。
*/
#include<iostream>
#include<fstream> 
#include<string>
using  namespace std;

struct node{
  int row,line,choice;//row和line分别表示行数和列数,每个点跳有8个方向,choice表示选择的方向
  node *next, *prior;
};

int n=0;//用来计算是跳的第几步
int board[10][9];//棋盘

//输出
void outcome(int c)
{
	//逐行逐列打印马能跳到的坐标
	int i,j,count=0;
	for(i=0;i<10;i++)
		for(j=0;j<9;j++)
			if(board[i][j]!=0)
			{
				count++;
				cout<<"可能的第"<<count<<"个坐标是:("<<i+1<<","<<j+1<<")\n";
			}
}

//跳步
void jump(int c,int x,int y,node *&q)
{
	node *&p = new node;
	//选择跳步方向
	switch(c)
	{
	case 1: x=x-2;y=y+1;break;
	case 2: x=x-2;y=y-1;break;
	case 3: x=x-1;y=y-2;break;
	case 4: x=x+1;y=y-2;break;
	case 5: x=x+2;y=y-1;break;
	case 6: x=x+2;y=y+1;break;
	case 7: x=x+1;y=y+2;break;
	case 8: x=x-1;y=y+2;break;
	}
	//插入刚刚跳的那一步
	p->row=q->row;
	p->line=q->line;
	p->choice=q->choice;
		q->prior->next=p;
		p->prior=q->prior;
		p->next=q;
		q->prior=p;
	q->row=x;
	q->line=y;
	q->choice=1;//刚插入的那一步的方向初始化为0
	n++;//计数
}

//回跳
void jumpback(node *&q)
{
	//删除尾端的一步
	node *p;
	p=q->prior;
	q->row=p->row;
	q->line=p->line;
	q->choice=p->choice;
	
	p->prior->next=q;
	q->prior=p->prior;
	delete p;
	q->choice++;//方向变更
	n--;//回跳相当于又少跳了一步
}



void main()
{
	char filename[80];
	cout<<"请输入要打开的文件名:";
	cin>>filename;
	ifstream fin(filename);
	if(!fin) cout<<"文件打开失败!"<<endl;//当文件不存在时给出提示

	int x,y,k;//x,y表示起点位置,k表示需跳的步数
	node *&h = new node;
	node *&track = new node;//表示当前正在跳的路线的轨迹
	node *&t = new node;
	track->next=t;
	t->prior=track;
	track->prior=h;
	h->prior=NULL;
	track->choice=1;//初始化为第一个方向
	fin>>x>>y>>k;//读入数据文件

	track->row=x;
	track->line=y;

	while(n<k)
	{
		if(track->choice>8)
		{
			//如果方向变更超出8了,说明该点的8个方向已跳完,该回跳
			if(n>0) jumpback(track);
			else break;//若此8个方向已跳完的点是起步的点,则跳出循环
		}
		else
		{
			jump(track->choice,track->row,track->line,track);

			if(track->row<1 || track->row>10 || track->line<1 || track->line>9) 
				jumpback(track);//如果跳出棋盘外,则回跳
			else if(n==k)
			{
				board[track->row-1][track->line-1]=1;//到达了该跳的步数,标记此坐标
				jumpback(track);//回跳到上一步
			}
		}
	}
	outcome(board[10][9]);
	fin.close();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -