天天看點

P1784的翻車求助

蒟蒻愛發題解啊,但是就算是神犇也有不知道咋做的題,更何況我這個中牛呢?是以就做了一個專欄,專門求助各路大咖神牛牛鬼蛇神,幫助本蒟蒻早日上中犇。
這個代碼的問題是時間超限,非常常見也是非常難搞的問題啊,主要是還沒有學過怎麼剪枝,是以在搜尋這塊兒有點拉跨,請各路高人幫助。
#include <bits/stdc++.h> 
using namespace std;
int tu[10][10]; 
void show(){
	for(int i = 0; i < 9; i++)
	{
		for(int j = 0; j < 9; j++)
			cout << tu[i][j] << " "; 
		cout << endl;
	}
	exit(0);
} 
bool check(int x,int y,int n)//判斷要填的數字是否重複 ,重複就傳回0 {
	for(int i=0;i<9;i++){
		if(tu[x][i]==n)return 0;//判斷列是否重複 
		if(tu[i][y]==n)return 0;//判斷行是否重複 
	}
	//判斷每個方陣小格子數字是否重複 
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			if(tu[i+x/3*3][j+y/3*3]==n)return 0; 
	return 1;
}
void dfs(int x,int y)//搜尋{
	if(tu[x][y] != 0)//已經填過了{
		if(x==8&&y==8)show();
		if(y==8)dfs(x+1,0);
		else dfs(x, y+1);
	} 
	if(tu[x][y]==0)//如果沒填過的{
		for(int i=1;i<=9;i++)//1~9每個數字填一遍{
			if(check(x,y,i)){
				tu[x][y]=i;
				if(x==8&&y==8)show();
				if(y==8)dfs(x+1,0);
				else dfs(x,y+1);	
				tu[x][y]=0;
			}
		}
	}
}
int main(){
	for(int i=0;i<9;i++)
		for(int j=0;j<9;j++)
			cin >> tu[i][j]; 
	dfs(0,0); 
	return 0;
} 
           

這個求助的文章就不友善求騙贊了,但還是給點一個吧

繼續閱讀