//这道题太经典了,刚开始还不晓得怎么做,然后看看解题报告,秒懂。。。。。,很难想到的就是以k从1到n*n递增,k/n表示x轴坐标,k%n表示y轴坐标。
AC代码:
#include<stdio.h> #include<string.h> #define max 12 char map[max][max]; int n,sum; int can(int x,int y) { int i; for(i=x-1;i>=0;i--) { if(map[i][y]=='O') { return 0; } if(map[i][y]=='X') { break; } } for(i=y-1;i>=0;i--) { if(map[x][i]=='O') { return 0; } if(map[x][i]=='X') { break; } } return 1; } void dfs(int k,int min) { if(k==n*n) { if(min>sum) { sum=min; return; } } else { int x=k/n; int y=k%n; if(map[x][y]=='.'&&can(x,y)) { map[x][y]='O'; dfs(k+1,min+1); map[x][y]='.'; } dfs(k+1,min); } } int main() { while(scanf("%d",&n)!=EOF&&n) { int i; for(i=0;i<n;i++) { scanf("%s",map[i]); } sum=0; dfs(0,0); printf("%d\n",sum); } return 0; }