一块矩形土地被分隔N*M的单位正方形,现在这块土地上已经埋设一些水管,水管将从坐标(1,1)的矩形土地的左上角左部边缘,延伸到坐标(N,M)的矩形土地的右下角边缘。水管只有两种。一种弯的,一种直的。
每种管道将占据一个单位正方形土地。你现在可以旋转这些管道,使得其构成一个管道系统。标有树木的方格表示这里没有管道。
输入的第一行为两个整数N和M,接下来输入N行,每行有M个整数,表示地图中的每一个格子。其中0表示树木,1-6表示管道的六种不同的摆放方式。
1 #include<stdio.h> 2 int a[51][51]; 3 int book[51][51],n,m,flag=0; 4 struct note{ 5 int x,y; 6 }s[100];//加入一个栈,便于将结果打印出来 7 int top=0; 8 void dfs(int x,int y,int front){ 9 if(x==n&&y==m+1){ 10 flag=1; 11 for(int i=1;i<=top;i++) 12 printf("(%d,%d)",s[i].x,s[i].y);//打印铺设结果 13 return; 14 } 15 if(x<1||x>n||y<1||y>m)//判断是否越界 16 return; 17 if(book[x][y]==1)//判断是否使用过该路径 18 return ; 19 book[x][y]=1; 20 top++;//结果入栈 21 s[top].x=x; 22 s[top].y=y; 23 //当前水管是直管的情况 24 if(a[x][y]>=5&&a[x][y]<=6){ 25 if(front==1) 26 {dfs(x,y+1,1); //进水口在左侧时,只能使用5号,这是下个位置,y+1是说明下个位置在右边,1是说明下个位置的进水口在左边 27 } 28 if(front==2) 29 dfs(x+1,y,2); 30 if(front==3) 31 dfs(x,y-1,3); 32 if(front==4) 33 dfs(x-1,y,4); 34 } 35 if(a[x][y]>=1&&a[x][y]<=4){ 36 if(front==1){ 37 dfs(x+1,y,2); 38 dfs(x-1,y,4); 39 } 40 if(front==2){ 41 dfs(x,y+1,1); 42 dfs(x,y-1,3); 43 } 44 if(front==3){ 45 dfs(x-1,y,4); 46 dfs(x+1,y,2); 47 } 48 if(front==4){ 49 dfs(x,y+1,1); 50 dfs(x,y-1,3); 51 } 52 } 53 book[x][y]=0; 54 top--; 55 return; 56 } 57 int main(){ 58 int i,j,num=0; 59 scanf("%d %d",&n,&m); 60 for(i=1;i<=n;i++) 61 for(j=1;j<=m;j++) 62 scanf("%d",&a[i][j]); 63 dfs(1,1,1); 64 if(flag==0) 65 printf("impossible "); 66 else 67 printf("找到铺设方案 "); 68 getchar(); 69 getchar(); 70 return 0; 71 }