习题 3_6 uva232 纵横字谜的答案

这题我感觉主要是要理解他的输出,可发现他的输出是从编号小到大依次来的,并且每个字母只可用一次,所以只要初始化正确,开个数组存编号,再来一个存使用情况,就ok
反正就两步,找起始点,
输出横的单词,后输出列的单词

小心是两组之间要有空行哦

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int r,l,wen  = 0;  // wen表示问题个数 
	while(scanf("%d",&r)==1 && r)
	{
		scanf("%d",&l);
		int ge = 0,b[12][12]={0},c[12][12]={0}; 
		char a[12][12]={'\0'};
		for (int i = 0; i < r;i++)
		  scanf("%s",a[i]);  //读入 r行 
		//起始寻找
		for (int i = 0; i < r;i++)
		 for (int j = 0; j < l;j++)
		 {                 //上              左 
		 	if((i==0||j==0||a[i-1][j]=='*'||a[i][j-1]=='*')&&a[i][j]!='*')
		 	  b[i][j] = ++ge;;
		 } 
		//暴力找数
		if(wen) printf("\n");
		printf("puzzle #%d:\n",++wen);
		printf("Across\n");
		for (int i = 0; i < r; i++)
		  for (int j = 0; j < l; j++)
		  {
		  	if(b[i][j]&&!c[i][j])  // 找的数既要是起始点,有要没用过 
		  	{
		  		printf("%3d.",b[i][j]);
		  		int x = i,y =j;
		  		while(x<r && y<l && a[x][y]!='*')
		  		{
		  			putchar(a[x][y]);
		  			c[x][y] = 1;
		  			y++;
		  		}
		  		printf("\n");
		  	}
		  }//across
		  printf("Down\n");
		  memset(c,0,sizeof(c)); // 刚才用了先清空 
        for (int i = 0; i < r; i++)
		  for (int j = 0; j < l; j++)
		  {
		  	if(b[i][j]&&!c[i][j])
		  	{
		  		printf("%3d.",b[i][j]);
		  		int x = i,y =j;
		  		while(x<r && y<l && a[x][y]!='*')
		  		{
		  			putchar(a[x][y]);
		  			c[x][y] = 1;
		  			x++;
		  		}
		  		printf("\n");
		  	}
		  }	
	}
	return 0;
	 
} 
发布了55 篇原创文章 · 获赞 1 · 访问量 2645

猜你喜欢

转载自blog.csdn.net/qq_37548017/article/details/100555659
今日推荐