八皇后
分析:按行放置,每放置一个递归下一行并把标记vis记为1,递归结束vis数组要还原为0。行数为max+1时输出标记数组;
1 #include<stdio.h> 2 #include<string.h> 3 #define max 8 4 int vis[10][10];//标记数组初始化为0,放置皇后后为1; 5 int check(int x,int y) 6 { 7 int i,j; 8 for(i=1;i<x;i++) 9 if(vis[i][y]==1)return 0;//判断正上方是否放置 10 i=x; 11 j=y; 12 while(--i>0&&--j>0)//判断左上方是否放置 13 if(vis[i][j]==1)return 0; 14 i=x; 15 j=y; 16 while(--i>0&&++j<=max)//判断右上方是否放置 17 if(vis[i][j]==1)return 0; 18 return 1; 19 } 20 void dfs(int pos) 21 { 22 int i; 23 if(pos==max+1)//以放置max行则递归结束并输出 24 { 25 int i,j; 26 for(i=1;i<=max;i++) 27 { 28 for(j=1;j<=max;j++) 29 printf("%d",vis[i][j]); 30 printf("\n"); 31 } 32 printf("\n"); 33 } 34 for(i=1;i<=max;i++) 35 { 36 if(check(pos,i))//判断是否可以放置皇后 37 { 38 vis[pos][i]=1; 39 dfs(pos+1); 40 vis[pos][i]=0; 41 } 42 } 43 44 45 } 46 int main() 47 { 48 memset(vis,0,sizeof(vis)); 49 dfs(1); 50 }