问题
https://vjudge.net/problem/UVA-211
分析
这题就是DFS,按照行的顺序先按照行再按照列进行DFS。
主要是要保存骨牌的信息。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=7;
int domino[7][8],vis[7][8],f[29],point[7][7],kase=0;
int dx[]={1,0},dy[]={0,1},cnt;
//打表,保存对应的牌号
void init(){
int amount=1;
for(int i=0;i<7;++i){
for(int j=i;j<7;++j){
point[i][j]=point[j][i]=amount++;
}
}
}
void output(int A[][8]){
for(int i=0;i<7;i++){
for(int j=0;j<8;j++)
{
printf("%4d",A[i][j]);//注意输出格式%4d
if(j==7)printf("\n");
}
}
printf("\n");
}
void dfs(int x,int y,int d){
if(d==28){
++cnt;
if(cnt==1) printf("Maps resulting from layout #%d are:\n\n\n",kase);
output(vis);
printf("\n");
return;
}
while(y<=8){
if(y==8){
++x;
y=0;
}
if(vis[x][y]==-1) break;
++y;
}
if(y<7 && vis[x][y+1]==-1){
int temp=point[domino[x][y]][domino[x][y+1]];
if(f[temp]==0){
f[temp]=1;
vis[x][y]=vis[x][y+1]=temp;
dfs(x,y+2,d+1);
vis[x][y]=vis[x][y+1]=-1;
f[temp]=0;
}
}
if(x<6 && vis[x+1][y]==-1){
int temp=point[domino[x][y]][domino[x+1][y]];
if(f[temp]==0){
f[temp]=1;
vis[x][y]=vis[x+1][y]=temp;
dfs(x,y+1,d+1);
vis[x][y]=vis[x+1][y]=-1;
f[temp]=0;
}
}
}
int main(void){
// freopen("../Ch01_ex/UVA211_in.txt","r",stdin);
// freopen("../Ch01_ex/UVA211_out.txt","w",stdout);
init();
while(scanf("%d",&domino[0][0])!=-1){
cnt=0;
memset(vis,-1,sizeof(vis));
memset(f,0,sizeof(f));
for(int i=1;i<8;++i) scanf("%d",&domino[0][i]);
for(int i=1;i<7;++i){
for(int j=0;j<8;++j)
scanf("%d",&domino[i][j]);
}
if(kase) printf("\n\n\n\n\n");
printf("Layout #%d:\n\n\n",++kase);
output(domino);
dfs(0,0,0);
printf("There are %d solution(s) for layout #%d.\n",cnt,kase);
}
return 0;
}