//main.c
//
1.cpp : Defines the entry point for the console application. // #include "stdio.h" #include "queen.h" int main(int argc, char* argv[]) { printf("\nnum = %d\n",queen(12)); return 0; }

 

dbg.h

1 #ifndef        _MRCHEN_DBG_H_
2 #define        _MRCHEN_DBG_H_
3     //#define    MY_DEBUG
4     void    dbgprint(char *sz_msg);
5 #endif

dbg.c

1 #include    "stdio.h"
2 #include    "dbg.h"
3 
4 void    dbgprint(char *sz_msg)
5 {
6     #ifdef    MY_DEBUG
7         printf("FILE : %s  LINE : %d\n\tMSG : %s\n",__FILE__,__LINE__,sz_msg);
8     #endif
9 }

queen.h

 1 #ifndef    _MRCHEN_2_H_
 2 #define    _MRCHEN_2_H_
 3 #ifndef    BOOL
 4 #define    BOOL    char    
 5 #define    FALSE    0      
 6 #define    TRUE    1      
 7 #endif
 8 
 9 typedef    struct    _tagPanel{
10     char        *panel_p;//排列
11     int         count;//找到的排列的种数
12     int         x,y;//
13     int         n;//棋盘的size
14 }PANEL,*PPANEL;
15 
16 //查看(x_i,y_i)位置是否合法
17 static    BOOL    init_panel(int    n);
18 
19 static    void    clean_panel();
20 
21 static    BOOL    check();
22 
23 static    BOOL    set(int    i);
24 
25 static    BOOL    next();
26 
27 static    int    next_line();
28 static    int    prev_line();
29 
30 BOOL      print();
31 
32 int    queen(int    n);
33         
34 #endif

queen.c

  1 #include    "malloc.h"
  2 #include    "string.h"
  3 #include    "queen.h"
  4 #include    "dbg.h"
  5 #define        MY_DEBUG
  6 
  7 static    PANEL        pan_st;
  8 
  9 int    queen(int    n)
 10 {    
 11     int    i = 0;
 12     int    ln;
 13     //init    
 14     if(FALSE == init_panel(n)){
 15         dbgprint("init failed");
 16         return    -1;
 17     }
 18     //loop
 19     for(i = 0;i < (n>>1);i++){
 20         set(i);
 21         next_line();
 22         do{
 23             if(!check()){
 24                 if(next()){
 25                     continue;    
 26                 }
 27                 if(prev_line()==0){
 28                     break;
 29                 }
 30                 continue;
 31             }else{
 32                 if(pan_st.n != next_line()){
 33                     continue;
 34                 }else{
 35                 //    print();
 36                     pan_st.count++;
 37                     if(next()){
 38                         continue;
 39                     }
 40                     if(prev_line()==0){
 41                         break;
 42                     }
 43                 }
 44             }
 45 
 46         }while(1);
 47     }
 48     //clean
 49     clean_panel();
 50     return    pan_st.count<<=1;
 51 }
 52 
 53 
 54 //init panel ,ok
 55 static    BOOL    init_panel(int    n)
 56 {
 57     dbgprint("init_panel");
 58     pan_st.panel_p = (char*)malloc(n*sizeof(char));
 59     if(pan_st.panel_p == NULL){
 60         return    FALSE;
 61     }
 62     pan_st.count = 0;
 63     pan_st.n = n;
 64     pan_st.x = pan_st.y = 0;
 65     return    TRUE;
 66 }
 67 
 68 //destroy panel,ok
 69 static    void    clean_panel()
 70 {
 71     dbgprint("clean_panel");
 72     if(pan_st.panel_p != NULL){
 73         free(pan_st.panel_p);
 74     }
 75 }
 76 
 77 
 78 //check
 79 static    BOOL    check()
 80 {
 81     int    i = 0;
 82 
 83     dbgprint("check");
 84     for(i=0;i < pan_st.y ;i++){
 85         if(pan_st.panel_p[i] == pan_st.x){
 86         //    printf("i = %d  (y,x) = (%d,%d)  pan_st.panel_p[%d] = %d\n",
 87         //            i,pan_st.y,pan_st.x,i,pan_st.panel_p[i]);
 88             return    FALSE;
 89         }
 90         if((pan_st.y-i) == (pan_st.x-pan_st.panel_p[i])
 91             ||(pan_st.y-i)==-(pan_st.x-pan_st.panel_p[i])){
 92             
 93         //        printf("i = %d  (y,x) = (%d,%d)  pan_st.panel_p[%d] = %d\n",
 94         //                i,pan_st.y,pan_st.x,i,pan_st.panel_p[i]);
 95                     
 96             return    FALSE;
 97         }
 98     }
 99     //printf("%d---%d\n",pan_st.y,pan_st.x);
100     return    TRUE;
101 }
102 
103 
104 //set first
105 static    BOOL    set(int    x)
106 {
107     dbgprint("set");
108     if(x >= pan_st.n || x<0){
109         return    FALSE;
110     }
111     pan_st.x = x;
112     pan_st.y = 0;
113     pan_st.panel_p[0] = x;
114     return    TRUE;
115 }
116 
117 
118 //get next
119 static    BOOL    next()
120 {
121     dbgprint("next");
122     do{
123         if(pan_st.x+1 == pan_st.n){
124             return    FALSE;
125         }
126         pan_st.panel_p[pan_st.y] = ++pan_st.x;
127     }while(!check());
128     return    TRUE;
129 }
130 
131 
132 //return    next line
133 static    int    next_line()
134 {
135     int    i = pan_st.y+1;
136     dbgprint("next_line");
137     if(i < pan_st.n ){
138         //printf("\n\ty = %d  x = %d\n",pan_st.y,pan_st.x);
139         pan_st.panel_p[pan_st.y] = pan_st.x;        
140         pan_st.y++;
141         pan_st.x = 0;
142     }
143     return    i;
144 }
145 
146 //return    previous line
147 static    int    prev_line()
148 {
149     int    i = 0;
150     dbgprint("prev_line");
151     while(0!=(i=--pan_st.y)){
152         pan_st.panel_p[pan_st.y] += 1;
153         if(pan_st.panel_p[pan_st.y] < pan_st.n){
154             pan_st.x = pan_st.panel_p[pan_st.y];
155             break;
156         }else{
157             continue;
158         }
159     }
160     return    i;
161 }
162 
163 
164 //print the panel,ok
165 BOOL      print()
166 {
167     int    i = 0,j = 0;
168     dbgprint("print");
169     for(; i < pan_st.n ;i++){
170         for(j=0;j < pan_st.n; j++){
171             if(pan_st.panel_p[i] != j){
172                 printf("O ");
173             }else{
174                 printf("# ");
175             }
176         }
177         printf("\n");
178     }
179     puts("=========================");
180     return    TRUE;
181 }

makefile

cc	=	cc
obj	=	main.o\
		queen.o\
		dbg.o
targets	:	$(obj)
	$(cc)	$(obj)	-o	main
main.o	:	main.c
queue.o	:	queen.h
dbg.o	:	dbg.h
clean:
	rm	*.o
	rm	main

 

posted on 2013-03-24 22:37  wowk  阅读(240)  评论(0编辑  收藏  举报