数独hdu1426

思路:首先输入的时候记录每一个空缺的位置,然后dfs每个空缺的位置。注意输出格式


#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using namespace std;
int sudoku[15][15];
char temp; 
bool viscur[15][15],visrow[15][15],visnie[15][15];

struct node{
	int x,y;
	node(int xx,int yy):x(xx),y(yy){
	}	
};

bool dfs(int num,vector v){
	if(num==v.size()) return true;
	int x=v[num].x;
	int y=v[num].y;
	int hh=ceil((x*1.0)/3);
	int ll=ceil((y*1.0)/3);
	int ninenum=(hh-1)*3+ll;
	for(int i=1;i<=9;i++){
		if(!viscur[i][x]&&!visrow[i][y]&&!visnie[i][ninenum]){
			sudoku[x][y]=i;
			viscur[i][x]=visrow[i][y]=visnie[i][ninenum]=true;
			if(dfs(num+1,v)) return true;///可以用这种方法来阻断递归后后续的操作。 
			viscur[i][x]=visrow[i][y]=visnie[i][ninenum]=false;
			//sudoku[x][y]=0; 
		} 
	}
	return false;
}

int main(){		
	int ff=0;
	while(cin>>temp){
		vector zero_loc;
		memset(viscur,0,sizeof(viscur));
		memset(visrow,0,sizeof(visrow));
		memset(visnie,0,sizeof(visnie)); 
		if(temp=='?') {
		temp='0';
		zero_loc.push_back(node(1,1));
		}
		int num=temp-'0';
		sudoku[1][1]=num;
		viscur[num][1]=true;
		visrow[num][1]=true;
		visnie[num][1]=true;
		for(int i=2;i<=9;i++){
			cin>>temp;
			int ninenum=ceil((i*1.0)/3);
			if(temp=='?') {
			temp='0';
			zero_loc.push_back(node(1,i));
			}
			int num=temp-'0';
			sudoku[1][i]=num;
			viscur[num][1]=true;
			visrow[num][i]=true;
			visnie[num][ninenum]=true;
		}///输入第一行  	
		
		for(int i=2;i<=9;i++)
		for(int j=1;j<=9;j++){
			//getchar();
			cin>>temp;
			if(temp=='?') {
			temp='0';
			zero_loc.push_back(node(i,j));
			}
			int num=temp-'0';
			sudoku[i][j]=num;
			viscur[num][i]=true;
			visrow[num][j]=true;
			int rr=ceil((j*1.0)/3);
			int cc=ceil((i*1.0)/3);
			int ninenum=rr+(cc-1)*3;
			visnie[num][ninenum]=true;
		}
		///test: 
		/*cout<

同样的题目:poj2426 竟然TLE了,,,也不知道是哪里写挫了。。。

#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using namespace std;
char str[20];
int sudoku2[20][20];
int t;
bool viscur[20][20],visrow[20][20],visbox[20][20];

struct node{
	int x,y;
	node(int xx,int yy):x(xx),y(yy){
	}
};

bool dfs(int cnt,vector zero_loc){
	if(cnt==zero_loc.size()) return true;
	int x=zero_loc[cnt].x;
	int y=zero_loc[cnt].y;
	int h=ceil(((x+1)*1.0)/3);
	int l=ceil(((y+1)*1.0)/3);
	int boxnum=(h-1)*3+l;
	for(int num=1;num<=9;num++){
		if(!viscur[x][num]&&!visrow[y][num]&&!visbox[boxnum][num]){
			viscur[x][num]=visrow[y][num]=visbox[boxnum][num]=true;
			sudoku2[x][y]=num;
			if(dfs(cnt+1,zero_loc)) return true;
			viscur[x][num]=visrow[y][num]=visbox[boxnum][num]=false;
			//sudoku2[x][y]=0;
		}
	}
	return false;
}

int main(){
	//std::ios::sync_with_stdio(false);
		//std::cin>>t;
		scanf("%d",&t);
		for(int i=0;i zero_loc;
			for(int i=0;i<9;i++){
				//std::cin>>str+1;
				scanf("%s",str);
				//cout<>sudoku[i]+1;
			for(int i=1;i<=9;i++)
			for(int j=1;j<=9;j++){
				int tmp=sudoku[i][j]-'0';
				if(!tmp){
				zero_loc.push_back(node(i,j));					
				}
				else{
					int h=ceil((i*1.0)/3);
					int l=ceil((j*1.0)/3);
					int boxnum=(h-1)*3+l;
					viscur[i][tmp]=visrow[j][tmp]=visbox[boxnum][tmp]=true;
					sudoku2[i][j]=tmp;
				}
			}*/
			dfs(0,zero_loc);
			//cout<<"ans:"<


你可能感兴趣的:(回溯,dfs)