这个算法暂时只能对n=4的情况进行求解,二维数组的参数传递方面我还没搞清,基本使用分治法来求解,每个格分两种情况分别进行讨论。 }//当前位置放置楼房 //a[i][j] value 0 空闲,1 占用 2 城堡 3 不用 int YFireNet(int a[][4],int l,int r , int n) { int i = l; while(i >= 0) { if(a[i][r] == 2) { break; } else if ((a[i][r] == 1)) { return 0; } else { i --; } } int j = l; while(j < n) { if(a[j][r] == 2) { break; } else if ((a[j][r] == 1)) { return 0; } else { j ++; } } int k = r; while( k < n ) { if(a[l][k] == 2) break; else if((a[l][k] == 1)) { return 0; } else k ++; } int s = r; while(s >= 0) { if(a[l][s] == 2) break; else if((a[l][s] == 1)) { return 0; } else s --; } a[l][r] = 1; return FireNet(a ,n) + 1; } //当前不位置放置楼房 int NFireNet(int a[][4],int l,int r ,int n) { if(a[l][r] == 0) a[l][r] = 3; return FireNet(a ,n); } int FireNet(int type[][4] ,int n) { int k,i,j; int lvalue,rvalue; lvalue = 0; rvalue = 0; for(k = 0;k < n*n ;k++) { i = k/n; j = k%n; if((type[i][j] == 2)||(type[i][j] == 1)||(type[i][j] == 3)) { k++; } else { lvalue += YFireNet(type,i,j,n); rvalue += NFireNet(type,i,j,n); } } return (lvalue > rvalue?lvalue:rvalue); } int _tmain(int argc, _TCHAR* argv[]) { int n=4,i,j,num; /*cout<<"Input stride" <<endl; cin>>n;*/ int area[4][4]; for(i = 0;i < n ;i++) { for(j = 0; j< n ; j++) { area[i][j] = 0; } } if(n > 4) { cout<<"The n is too huge!"; return 0; } cout<<"输入城堡个数"<<endl; cin>>num; cout<<"输入城堡坐标:"<<endl; for(int s = 0; s < num;s++) { cin>>i>>j; area[i][j] = 2; } for(i = 0;i< n ;i++) { for(j = 0 ; j < n ; j ++) { cout<<area[i][j]<<" "; } cout<<endl; } int sum = 1 + FireNet(area,n); cout<<"sum = "<<sum<<endl; for(i = 0;i< n ;i++) { for(j = 0 ; j < n ; j ++) { cout<<area[i][j]<<" "; } cout<<endl; } int skl; cin>>skl; return 0; }