题意:貌似有中文题意,求组合的问题。 我的算法是搜索,写了我好久,果然我的搜索不给力呀。 额。。可以算是比较简单的搜索吧 我的只能算是过了 不能算是最优的。 #include <iostream> #include <string> using namespace std; int map[9][9]; int putmap[9][9];//记录的是那些点已经被放下棋子 int n,k; int sum; int right(int a[][9],int i,int j) //判断是否可以在这个点放棋 { int x; for(x = 1 ; x <=n ; x++ ) if(a[x][j] != 0) return 0; for(x = 1 ; x <= n ; x++) if(a[i][x] != 0) return 0; return 1; } void output() //输出查看的函数 { int i ,j; for(i = 1 ; i <= n ; i++) { for(j = 1 ; j <= n ; j++) cout<<putmap[i][j] <<" "; cout<<endl; } cout<<endl; } void dfs(int x,int y,int ti)//dfs的主要算法,sum的值为以x,y为起点搜索的个数 { int i,j; if(ti == k) { sum++; ti--; putmap[x][y] = 0; return ; } for(i = x+1 ; i <= n ; i++) { for(j = 1 ; j <= n ;j++) { if(map[i][j] == 1 && right(putmap,i,j) ) { ti++; putmap[i][j] = ti ; dfs(i,j,ti);//递归搜索 ti--; putmap[i][j] = 0; } } } } int main() { int i,j; int outsum; string as; while(cin>>n>>k,n != -1 && k != -1) { outsum = 0; memset(map,0,sizeof(map)); memset(putmap,0,sizeof(putmap)); for(i = 1 ; i <= n ; i++) { string as; cin>>as; for(j = 1 ; j <= n ; j++) { if(as[j-1] == '#') map[i][j] = 1; else map[i][j] = 0; } } for(i = 1 ; i <= n ; i++) //此循环为以i,j为第一个放棋子的点 { for(j = 1 ; j <= n ; j++) { memset(putmap,0,sizeof(putmap)); if(map[i][j] == 1) { putmap[i][j] = 1; sum = 0; dfs(i,j,1); outsum+=sum; } } } cout<<outsum<<endl; } return 0; }