方格填数
在n行m列的格子中填入1到m∗n数字。要求:相邻的格子中的数,右边的大于左边的,下边的大于上边的。如图所示的 2 种,就是正确的填法。
输入格式:
第一行给出两个正整数n、m,表示方格的行数和列数。 (1≤n∗m≤18)
输出格式:
输出符合条件的方格数量。
输入样例:
在这里给出一组输入。例如:
2 5
输出样例:
在这里给出相应的输出。例如:
42
思路:dfs暴力搜索。
#include<cstdio>
#include<algorithm>
using namespace std;
int use[20],mp[20][20],n,m,ans;
void dfs(int x,int y,int v){
if(x==n&&y==m){ans++;return;}
mp[x][y]=v;
if(y==m) y=1,x++,v=mp[x-1][y]; //换行
else if(x!=1) y++,v=max(v,mp[x-1][y]); //确保下面的数大于上面的
else y++;
for(int i=v+1;i<=n*m;i++){
if(use[i]==0&&m*n-i>=(m-y+1)*(n-x+1)-1){ //判断剩余的数能否填完表
use[i]=1;
dfs(x,y,i);
use[i]=0;
}
}
}
int main(){
scanf("%d%d",&n,&m);
mp[1][1]=1;
dfs(1,1,1);
printf("%d\n",ans);
}