方格填数
题目:
如下的10个格子:
答案:1580
你有0~9十个数,每个数只能用一次,且连续的数不能放在相邻的格子里(上下,左右对角都算相邻)
思路:模拟每个位置能放的数,DFS;递归深度为格子的个数,每个格子有10种选择:0~9,从左上角格子出发,递归出口为到达右下角:
代码:
#include<iostream> #include<math.h> #include<cmath> #include<string.h> using namespace std; const int maxn=5; const int inf=99999999; bool vis[15]; int a[maxn][maxn]; int ans=0; bool judge(int x,int y,int m) { for(int i=-1;i<=0;i++) { for(int j=-1;j<=1;j++) { int xx=x+i; int yy=y+j; if(xx<0||yy<0||xx>2||yy>3) continue; if(abs(a[xx][yy]-m)==1) return false; } } return true; } void dfs(int x,int y) { //cout<<"x:"<<x<<" "<<"y:"<<y<<endl; if(x==2&&y==3) { ans++; return ; } if(x<0||y<0||x>2||y>3) return ; for(int i=0;i<10;i++) { if(!vis[i]&&judge(x,y,i)) { vis[i]=true; a[x][y]=i; //cout<<"a[x][y]:"<<a[x][y]<<endl; if(y!=3)dfs(x,y+1); else dfs(x+1,0); vis[i]=false;//回溯 a[x][y]=inf;//回溯 } } } int main() { memset(vis,false,sizeof(vis)); for(int i=0;i<3;i++) { for(int j=0;j<4;j++) a[i][j]=inf; } dfs(0,1); cout<<ans<<endl; }
当初的梦想实现了吗,事到如今只好放弃吗~