📄 mm.h
字号:
void visit(Point[7][8],Point[7][8],int,int,int);
void show(Point[7][8]);
void copyf(Point[7][8],Point[7][8]);
int count=0;
void Gp(Point A[7][8],Point B[7][8]){
bool IsEnd;
IsEnd=false;
int i=0,j=0;
while(i<7&&A[i][j].visited){
while(j<8&&A[i][j].visited)j++;//取得第一个没有被访问过的数
if(j==8){
i++;//从第二个循环中退出来的时候i++了
j=0;
}
}
if(i==7&&j==0&A[i-1][j-1].visited){
IsEnd=true;//判断是否已经遍历完数组
count++;//这是一个正确的解
cout<<endl<<"得到第"<<count<<"个解,如下:"<<endl;
show(A);
}
else{
Point C[7][8],D[7][8];
if(j<7){//j=7不能进行第一模式访问(横向访问)
copyf(A,C);
copyf(B,D);
visit(C,D,i,j,1);
}
if(i<6){//i=6不能进行第二模式访问(纵向访问)
copyf(A,C);
copyf(B,D);
visit(C,D,i,j,2);
}
}
}
void visit(Point A[7][8],Point B[7][8],int i,int j,int mode){
// cout<<"A["<<i<<"]["<<j<<"]="<<A[i][j].data<<" Mode="<<mode<<endl;
if(mode==1&&!A[i][j+1].visited&&!B[A[i][j].data][A[i][j+1].data].visited){
A[i][j].visited=true;
A[i][j+1].visited=true;
if(A[i][j].data<7||A[i][j+1].data<7){
B[A[i][j].data][A[i][j+1].data].visited=true;
A[i][j].data=B[A[i][j].data][A[i][j+1].data].data;
A[i][j+1].data=A[i][j].data;//A[i][j].data已经改变,不能再用上面右边的表达式
Gp(A,B);
}
else cout<<"有错误产生!!"<<endl;
}
if(mode==2&&!A[i+1][j].visited&&!B[A[i][j].data][A[i+1][j].data].visited){
A[i][j].visited=true;
A[i+1][j].visited=true;
if(A[i][j].data<7||A[i+1][j].data<7){
B[A[i][j].data][A[i+1][j].data].visited=true;
A[i][j].data=B[A[i][j].data][A[i+1][j].data].data;
A[i+1][j].data=A[i][j].data;
Gp(A,B);
}
else cout<<"有错误产生!!"<<endl;
}
}
void show(Point A[7][8]){
for(int i=0;i<7;i++){
for(int j=0;j<8;j++){
if(A[i][j].data<10)cout<<" ("<<i<<","<<j<<")"<<A[i][j].data;
else cout<<" ("<<i<<","<<j<<")"<<A[i][j].data;
}
cout<<endl;
}
}
void copyf(Point A[7][8],Point B[7][8]){
for(int i=0;i<7;i++)
for(int j=0;j<8;j++)B[i][j]=A[i][j];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -