DPS演算法 馬走日字 視覺化
阿新 • • 發佈:2018-11-17
#include <stdio.h> #include <stdlib.h> #define N 4 static int count; void print_line() //分割線 { printf("\n\n-------------------------------------------------------\n\n"); } int judge(int *a,int x1,int x2,int y2,int m) { if(x1>x2-1||(x1==x2-1&&a[x1]!=y2)||a[x1]<1||a[x1]>m) return 0; return 1; } void print_map(int *a,int m,int n,int x2) //列印棋盤 { int i,j,k; count++; print_line(); printf("路線%d:\n\n",count); for(i=m;i>=1;i--) { if(i==m) { for(k=1;k<=n;k++) printf(k+1>=10?"%-3d":"%-4d",k); puts(""); } for(j=0;j<n;j++) { if(j==0) printf(a[j]!=i||j>x2-1?"+":"O"); else if(j==n-1) printf(a[j]!=i||j>x2-1?"---+":"---O"); else printf(a[j]!=i||j>x2-1?"---+":"---O"); } if(i>=2) { puts(""); for(k=0;k<n-1;k++) printf("| "); printf("|\n"); } } } void think(int *a,int x1,int x2,int y2,int m,int n) { int i; if(a[x1]==y2&&x1==x2-1) //狀態搜尋樹遍歷到葉子結點列印棋盤 print_map(a,m,n,x2); else { for(i=0;i<N;i++) { switch(i) //馬要走的方向 { case 0:x1++;a[x1]=a[x1-1]+2;break; case 1:x1+=2;a[x1]=a[x1-2]+1;break; case 2:x1+=2;a[x1]=a[x1-2]-1;break; case 3:x1++;a[x1]=a[x1-1]-2;break; } if(judge(a,x1,x2,y2,m)) think(a,x1,x2,y2,m,n); switch(i) //返回,繼續遍歷 { case 0:a[x1]=a[x1-1]-2;x1--;break; case 1:a[x1]=a[x1-2]-1;x1-=2;break; case 2:a[x1]=a[x1-2]+1;x1-=2;break; case 3:a[x1]=a[x1-1]+2;x1--;break; } } } } int main() { int x1,y1,x2,y2,m,n; int i,*a; char key; do { count=0; print_line(); printf("請輸入n,m:"); scanf("%d%d",&n,&m); print_line(); printf("請輸入起點座標:"); scanf("%d%d",&x1,&y1); print_line(); printf("請輸入終點座標:"); scanf("%d%d",&x2,&y2); a=(int*)malloc(n*sizeof(int)); for(i=0;i<n;i++) a[i]=0; a[x1-1]=y1; think(a,x1-1,x2,y2,m,n); print_line(); printf("共有%d條路線!",count); print_line(); printf("是否繼續計算:[ ]\b\b"); fflush(stdin); scanf("%c",&key); }while(key=='Y'||key=='y'); return 0; }
最近對狀態搜尋樹,dfs的應用很感興趣,還要繼續加強學習!