
C++通过解数独来学习递归和回溯,但是程序运行不下去,求教!!! 20
下面是我的代码,我是个初学者,对C++比较感兴趣,希望dalao帮忙解决我的问题,下面是我的代码。#include<iostream>usingnamespacestd;...
下面是我的代码,我是个初学者,对C++比较感兴趣,希望dalao帮忙解决我的问题,下面是我的代码。
#include<iostream>
using namespace std;
void dfs(int a[][9],int row ,int col);
int main()
{
int a[9][9];
for(int x=0;x<9;x++)
{
for(int y=0;y<9;y++)
{
cout<<"a"<<x<<y<<"= ";
cin>>a[x][y];
}
cout<<endl;
}
dfs(a,0,0);
}
void dfs(int a[][9],int row ,int col)
{
bool flag=true;
if(a[row][col]!=0&&col<8) dfs(a,row,col+1); flag=false ; //按行先填,进入这一行的下一个格子
if(a[row][col]!=0&&col==8) dfs(a,row+1,col); flag=false ; //进入下一行的第一个格子 递归
if(flag==true)
{
int b[9]={1,2,3,4,5,6,7,8,9}; //b[9]中存储第row行,col列空位能填的数字
int num;
for(int r=row,c=0;c<9;c++)
{
if(a[r][c]!=0) {num=a[r][c]; b[num]=0;} //除去b[9]中因行不能填的数
}
for(int r=0,c=col;r<9;r++)
{
if(a[r][c]!=0) {num=a[r][c]; b[num]=0;} //除去b[9]中因列不能填的数
}
for(int v=1;v<=3;v++)
{
for(int n=1;n<=3;n++)
{
if(a[row/3*3+v][col/3*3+n]!=0)
{
num=a[row/3*3+v][col/3*3+n];
b[num]=0; //消去九宫格内不能填的数字
} //此时b[9]中不为0的数就是a[row][col]能填入的数字
}
} //接下来将数字一一填入a中 并且实现回溯
for(int i=0;i<9;i++)
{
int count; //用来记录b[9]中有多少个0,如果有9个0,则回溯
if(b[i]!=0) {a[row][col]=b[i];b[i]=0; break;} //填入一个可能的数字
if(b[i]==0) {count++;};
if(count==9&&col>0) {dfs(a,row,col-1);}
if(count==9&&col==0) {dfs(a,row-1,col);}
if(count==9&&row==0) {cout<<"数组无解";} //回溯
}
if(col<8) dfs(a,row,col+1); //按行先填,进入这一行的下一个格子
if(col==8) dfs(a,row+1,col); //进入下一行的第一个格子 递归
}
if(row==8&&col==8)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
cout<<a[i][j];
cout<<endl;
}
}
}
程序运行到输入完数组就直接结束了 展开
#include<iostream>
using namespace std;
void dfs(int a[][9],int row ,int col);
int main()
{
int a[9][9];
for(int x=0;x<9;x++)
{
for(int y=0;y<9;y++)
{
cout<<"a"<<x<<y<<"= ";
cin>>a[x][y];
}
cout<<endl;
}
dfs(a,0,0);
}
void dfs(int a[][9],int row ,int col)
{
bool flag=true;
if(a[row][col]!=0&&col<8) dfs(a,row,col+1); flag=false ; //按行先填,进入这一行的下一个格子
if(a[row][col]!=0&&col==8) dfs(a,row+1,col); flag=false ; //进入下一行的第一个格子 递归
if(flag==true)
{
int b[9]={1,2,3,4,5,6,7,8,9}; //b[9]中存储第row行,col列空位能填的数字
int num;
for(int r=row,c=0;c<9;c++)
{
if(a[r][c]!=0) {num=a[r][c]; b[num]=0;} //除去b[9]中因行不能填的数
}
for(int r=0,c=col;r<9;r++)
{
if(a[r][c]!=0) {num=a[r][c]; b[num]=0;} //除去b[9]中因列不能填的数
}
for(int v=1;v<=3;v++)
{
for(int n=1;n<=3;n++)
{
if(a[row/3*3+v][col/3*3+n]!=0)
{
num=a[row/3*3+v][col/3*3+n];
b[num]=0; //消去九宫格内不能填的数字
} //此时b[9]中不为0的数就是a[row][col]能填入的数字
}
} //接下来将数字一一填入a中 并且实现回溯
for(int i=0;i<9;i++)
{
int count; //用来记录b[9]中有多少个0,如果有9个0,则回溯
if(b[i]!=0) {a[row][col]=b[i];b[i]=0; break;} //填入一个可能的数字
if(b[i]==0) {count++;};
if(count==9&&col>0) {dfs(a,row,col-1);}
if(count==9&&col==0) {dfs(a,row-1,col);}
if(count==9&&row==0) {cout<<"数组无解";} //回溯
}
if(col<8) dfs(a,row,col+1); //按行先填,进入这一行的下一个格子
if(col==8) dfs(a,row+1,col); //进入下一行的第一个格子 递归
}
if(row==8&&col==8)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
cout<<a[i][j];
cout<<endl;
}
}
}
程序运行到输入完数组就直接结束了 展开
1个回答
展开全部
最后一个大括号之后 输入 system("pause");
进行观察
进行观察
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询