Dev C++编译成功后运行显示“程序已停止工作”,求解!

马拦过河卒
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
【输入】
一行四个数据,分别表示B点坐标和马的坐标。
【输出】
一个数据,表示所有的路径条数。
【样例】
knight.in knight.out
6 6 3 3 6
#include<iostream>
using namespace std;
const int dx[8]={1,2,2,1,-1,-2,-2,-1};
const int dy[8]={2,1,-1,-2,-2,-1,1,2};
const int cx[2]={1,0};
const int cy[2]={0,1};
void dfs(int i);
void print (int i);
int n,m,a,b,i,x[15],y[15];
int mx[15],my[15];
int main(){
cin>>n>>m;
cin>>a>>b;

for(int j=1;j<=8;++j)
{mx[j]=a+mx[j];
my[j]=b+my[j];
}
x[1]=0;y[1]=0;
dfs(1);
cout<<i<<endl;
return 0;
}
void dfs(int i){
if(x[i]==n&&y[i]==m)
print(i);
for(int j=0;j<2;++j)
{
if(x[i]+cx[j]>=0&&x[i]+cx[j]<=n&&y[i]+cy[j]>=0&&y[i]+cy[j<=m])
{
x[i+1]=x[i]+cx[j];
y[i+1]=y[i]+cy[j];
dfs(i+1);
}

}
}
void print(int i){
for(int j=1;j<=i;++j) cout<<"("<<x[j]<<","<<y[j]<<")";
cout<<endl;
}

第1个回答  2014-08-04
for(int j=1;j<=8;++j)
{mx[j]=a+mx[j];
my[j]=b+my[j];
}
下标应该是从0到7
所以正确的代码应该是
for(int j=0;j<8;++j)
{
mx[j]=a+mx[j];
my[j]=b+my[j];
}追问

但是我改完以后还是停止工作呀

追答

!!!
好吧还有一个问题
void dfs(int i){
if(x[i]==n&&y[i]==m)
print(i);
for(int j=0;j=0&&x[i]+cx[j]=0&&y[i]+cy[j>n>>m;
cin>>a>>b;

for(int j=1;j<=8;++j)
{mx[j]=a+mx[j];
my[j]=b+my[j];
}
x[1]=0;y[1]=0;
/*在这里加入cout<<"haha\n";如果显示了haha,则代表前面没有问题,如果没有显示就停止运行代表前面有问题*/
dfs(1);
cout<<i<<endl;//如果前面显示了haha但是这里没有显示i代表程序在dfs中崩溃
return 0;
}
需要学会一些诸如此类的调试方法来找出你程序的问题。或者你可以在dfs函数中加入一句cout<<i<<" ";如果显示超过了15则数组越界,这样可以检测
不过目前比较常见的停止运行的可能,主要是数组越界、递归层数过多,你从这两个原因之中找一个来验证,当然可能两个都有,自己调试吧

本回答被提问者和网友采纳
第2个回答  2014-08-04
数组下表是从0开始到n-1, 你的数组访问都越界了