UVA 211 The Domino Effect
https://vjudge.net/problem/UVA-211
题意:
7*8 网格 放“双六” 多米诺骨牌,有多少种放法
如果每次找第一个没有骨牌的放,TLE
dfs参数里加上这一次要在哪儿放
#include<cstdio> #include<algorithm> using namespace std; int id[7][7],cnt,tot; int point[7][8],ans[7][8]; bool vis[29]; int get(int i,int j,int I,int J) { return id[min(point[i][j],point[I][J])][max(point[i][j],point[I][J])]; } bool check(int x) { for(int i=0;i<7;i++) if(!ans[x][i]) return false; return true; } void dfs(int x,int y) { if(y==8) { x++;y=0; if(x==7) { tot++; for(int i=0;i<7;i++) { for(int j=0;j<8;j++) printf("%4d",ans[i][j]); printf("\n"); } printf("\n"); return; } } if(ans[x][y]) dfs(x,y+1); else { if(y!=7 && !ans[x][y+1]) { int t=get(x,y,x,y+1); if(!vis[t]) { ans[x][y]=ans[x][y+1]=t; vis[t]=true; dfs(x,y+1); ans[x][y]=ans[x][y+1]=0; vis[t]=false; } } if(x!=6 && !ans[x+1][y]) { int t=get(x,y,x+1,y); if(!vis[t]) { ans[x][y]=ans[x+1][y]=t; vis[t]=true; dfs(x,y+1); ans[x][y]=ans[x+1][y]=0; vis[t]=false; } } } } int main() { //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); for(int i=0;i<=6;i++) for(int j=i;j<=6;j++) id[i][j]=++cnt; int T=0; while(scanf("%d",&point[0][0])!=EOF) { if(T) printf("\n\n\n"); printf("Layout #%d:\n\n",++T); for(int i=1;i<8;i++) scanf("%d",&point[0][i]); for(int i=1;i<7;i++) for(int j=0;j<8;j++) scanf("%d",&point[i][j]); for(int i=0;i<7;i++) { for(int j=0;j<8;j++) printf("%4d",point[i][j]); printf("\n"); } printf("\n"); printf("Maps resulting from layout #%d are:\n\n",T); tot=0; dfs(0,0); printf("There are %d solution(s) for layout #%d.\n",tot,T); } }