用遞歸實現各種情況的枚舉,可以看做是考察DPS的簡單實現。
1 #include <stdio.h>
2
3 int n,max,count,target[4][4];
4
5 int place(int x,int y){
6 int i;
7 for(i=y;i>=0;i--){
8 if(target[x][i]>0)
9 return 0;
10 if(target[x][i]<0)
11 break;
12 }
13 for(i=y;i<n;i++){
14 if(target[x][i]>0)
15 return 0;
16 if(target[x][i]<0)
17 break;
18 }
19 for(i=x;i>=0;i--){
20 if(target[i][y]>0)
21 return 0;
22 if(target[i][y]<0)
23 break;
24 }
25 for(i=x;i<n;i++){
26 if(target[i][y]>0)
27 return 0;
28 if(target[i][y]<0)
29 break;
30 }
31 return 1;
32 }
33
34 void DFS(){
35 int i,j;
36 if(count>max)
37 max=count;
38 for(i=0;i<n;i++){
39 for(j=0;j<n;j++){
40 if(!target[i][j]&&place(i,j)){
41 target[i][j]=1;
42 count++;
43 DFS();
44 count--;
45 target[i][j]=0;
46 }
47 }
48 }
49 }
50
51 int main(){
52 int i,j;
53 char c;
54 while(1){
55 scanf("%d",&n);
56 if(n==0)
57 break;
58 max=count=0;
59 for(i=0;i<n;i++){
60 getchar();
61 for(j=0;j<n;j++){
62 scanf("%c",&c);
63 target[i][j]=(c=='X'?-1:0);
64 }
65 }
66 DFS();
67 printf("%d\n",max);
68 }
69 return 0;
70 }
之前A過的,給你參考參考
#include<iostream>
#include<cstring>
using namespace std;
char map[4][4];
int maxt;
bool legal(int a,int b)
{
int i;
if(map[a][b]=='X'||map[a][b]=='+')return false;
for(i=a-1;i>=0;i--)
{
if(map[i][b]=='+')return false;
else if(map[i][b]=='X')break;
}
for(i=b-1;i>=0;i--)
{
if(map[a][i]=='+')return false ;
else if(map[a][i]=='X')break;
}
return true;
}
void maker(int k,int count,int n)
{
int i,j;
if(k==n*n)
{
if(count>maxt)maxt=count;
return;
}
else
{
i=k/n;
j=k%n;
if(legal(i,j))
{
map[i][j]='+';
maker(k+1,count+1,n);
map[i][j]='.';
}
maker(k+1,count,n);
}
}
int main()
{
int n;
while(cin>>n)
{
if(n==0)break;
int i,j;
for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>map[i][j];
maxt=0;
maker(0,0,n);
cout<<maxt<<endl;
}
}
因為Windows的開發者自己定義了CHAR和TCHAR,他們自己定義的CHAR是unsigned char,為了防止不同編譯器產生不同的代碼,因為C標准並沒有規定說char必須是不是unsigned的。所以自己固定一種比較好。而且為了兼容DOS下對8位擴展ASCII碼處理,應該是0~255的范圍。-128~127的char只是早期C語言編譯器習慣的定義,這個定義微軟的C編譯器也繼承了,但是OS開發者和編譯器團隊都想要一些獨立性。