http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=24022
思路:搜索
具体看注释。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char s[10][100]; int a[10][20]; int visit[50]; int num[50]; int add[50]; int cnt=0; int mm=0; void init() { memset(visit,0,sizeof(visit)); memset(a,0,sizeof(a)); for(int i=1;i<=5;i++) { for(int j=0;j<=8;j++) { if(s[i][j]=='.')continue; else if(s[i][j]=='x')num[++cnt]=0; else num[++cnt]=s[i][j]-'A'+1,visit[num[cnt]]=1; //每一个需要填数的空对应一个编号 从 1 到 12 //如果数字已经使用,标记 } } } int check() { if(num[1]+num[3]+num[6]+num[8]>26)return 0; if(num[1]+num[4]+num[7]+num[11]>26)return 0; if(num[2]+num[3]+num[4]+num[5]>26)return 0; if(num[8]+num[9]+num[10]+num[11]>26)return 0; if(num[2]+num[6]+num[9]+num[12]>26)return 0; if(num[5]+num[7]+num[10]+num[12]>26)return 0; return 1; } void go() { for(int i=1;i<=5;i++) for(int j=0;j<=8;j++) if(s[i][j]!='.') s[i][j]=(char)('A'+num[++mm]-1); } void output() { for(int i=1;i<=5;i++) cout<<s[i]<<endl; } void dfs(int k) { if(!check()) return ;//如果某一个需要满足的方向大于了26 停止搜索 if(k==13) { go(); output(); //如果已经填到了第13个数 那么说明已经填好了因为之前没有一个 //方向是大于26的输出之 exit(0); } if(num[k]) dfs(k+1);//如果该编号已经填了数字 搜索下一个编号 else for(int i=1;i<=12;i++) if(!visit[i]) { visit[i]=1; num[k]=i; dfs(k+1); visit[i]=0;//返回时要清楚利用的标记 清楚了现场 num[k]=0; } return ; } int main() { while(scanf("%s",s[1])!=EOF) { for(int i=2;i<=5;i++) scanf("%s",s[i]); init(); dfs(1); } return 0; }