八皇后

来源:互联网 发布:表情图片制作软件下载 编辑:程序博客网 时间:2024/04/28 19:08

这是做题前写的简单的思路

1、输入n,皇后个数

2、从0开始,放皇后
放皇后条件{ 1、横向row==0
2、纵向hign==0
3、斜线line1==0
4、斜线line2==0
5、皇后个数未超界
}
放完皇后,row、high、line1、line2,都等于1
最后一个皇后成立,输出记录数组


了解了主要思路以后,解题就轻松多了。
无须多言,看我的注释就好

#include <stdio.h>int N;//皇后个数int record[101][101]={0};//记录每个位置是否有皇后int row[101]={0};//记录某一行是否有皇后int high[101]={0};//记录每一列int line1[202]={0};//‘/’的斜线int line2[202]={0};//‘\’的斜线int tms=0;//可能的情况数void print(){int i,j;for (i=0;i<N;i++){for (j=0;j<N;j++){printf("%d ",record[i][j]);}printf("\n");}printf("\n");}int judge(int i,int j){if (row[i]||high[j]||line1[i+j]||line2[i+N-1-j])//有一个标记为1,这个点就不能放return 0;else return 1;}void unmark(int i,int j){row[i]=0;high[j]=0;line1[i+j]=0;line2[i+N-1-j]=0;record[i][j]=0;}void mark(int i,int j){row[i]=1;high[j]=1;line1[i+j]=1;//注意观察就能发现,每个斜线都能有它唯一的编号line2[i+N-1-j]=1;//想不到的话就画图观察一下,你能观察到的record[i][j]=1;}void add(int n){int i;//int result;if (n==N-1)//放置最后一行时,有一个可放置点,即输出一种情况{for (i=0;i<N;i++){if (judge(n,i))//判断(n,i)这个点是否合法{mark(n,i);//若合法,则对该点进行标记print();//输出当前的皇后排布tms++;unmark(n,i);//取消对该点的标记,因为所有的标记数组都是全局变量}}} else{for(i=0;i<N;i++){//对第n行的每个点进行判断if(judge(n,i)) {mark(n,i);add(n+1);//第n行放置一个皇后以后,在第n+1行放置皇后unmark(n,i);}}}}int main(){scanf("%d",&N);//输入皇后个数add(0);//从第0行开始放置if (tms==0)//输出有多少种情况{printf("Sorry,%d Empress can not be peaceful\n",N);}else printf("There's %d ways to put them~\n",tms);return 0;}


	
				
		
原创粉丝点击