運動3_6 uva232クロスワードパズルの答え

私はこの質問は、彼の主な出力を理解することであると感じ、彼の出力で見つけることができますが、少数の大口注文からであり、各文字が再び預金を使用して、限り適切に初期化され、配列の寄託番号を開くには、1回のみ可能です場合、それはOKで
、出発点を見つけるために、二段階とにかく
出力列の単語の後、出力クロスワードパズルを

注意は、二つのグループ間の空行がOHであることがあります

#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