注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
思路:
DFS
優化:
因為搜索的位置是按照很縱坐標依次增大來的,所以原來設定的8個方向就可以縮短為4個方向。
測試結果:1580
代碼:
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>using namespace std;int ans[3][4];bool bns[10];int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};int sum=0;void init(){ memset(ans,-1,sizeof(ans)); memset(bns,false,sizeof(bns));}bool check(int x, int y, int num){ int sx,sy; for(int i=0;i<=7;i++) { sx=x+dir[i][0]; sy=y+dir[i][1]; if(sx<0||sx>2||sy<0||sy>3)//越界跳過 continue; if(ans[sx][sy]==-1) continue; if(fabs(ans[sx][sy]-num)==1) return false; } return true;}void dfs(int x, int y)//位置的橫坐標、縱坐標{ for(int i=0;i<=9;i++) { if(!bns[i]&&check(x,y,i))//沒有使用過i,并且檢查可用 { bns[i]=true; ans[x][y]=i; if(x==2&&y==2) { sum++; } else { if(y!=3) dfs(x,y+1); else { dfs(x+1,0); } } bns[i]=false; ans[x][y]=-1; } }}int main(){ init(); dfs(0,1); PRintf("%d/n",sum);//1580 return 0;}優化之后:#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>using namespace std;int ans[3][4];bool bns[10];int dir[4][2]={{-1,-1},{-1,0},{-1,1},{0,-1}};int sum=0;void init(){ memset(ans,-1,sizeof(ans)); memset(bns,false,sizeof(bns));}bool check(int x, int y, int num){ int sx,sy; for(int i=0;i<=3;i++) { sx=x+dir[i][0]; sy=y+dir[i][1]; if(sx<0||sx>2||sy<0||sy>3)//越界跳過 continue; if(ans[sx][sy]==-1) continue; if(fabs(ans[sx][sy]-num)==1) return false; } return true;}void dfs(int x, int y)//位置的橫坐標、縱坐標{ for(int i=0;i<=9;i++) { if(!bns[i]&&check(x,y,i))//沒有使用過i,并且檢查可用 { bns[i]=true; ans[x][y]=i; if(x==2&&y==2) { sum++; } else { if(y!=3) dfs(x,y+1); else { dfs(x+1,0); } } bns[i]=false; ans[x][y]=-1;//優化之后這里就不用恢復現場也可以 } }}int main(){ init(); dfs(0,1); printf("%d/n",sum);//1580 return 0;}
新聞熱點
疑難解答
圖片精選