一路蛋疼的编程题,来自《C语言程序设计:现代方法(第二版)》
一道蛋疼的编程题,来自《C语言程序设计:现代方法(第二版)》
原书第八章的编程题。
我是小白,花了两个小时写了出来,感觉很繁琐。
有木有更简便的方法呢?
百度找到的许多方法,感觉略微不全面。
****论坛的赵四老师的代码,看得我晕乎乎的。
然后题目我就不赘述了,有关题目的链接在这里:
http://bbs.chinaunix.net/thread-3769671-1-1.html
我写的代码,比较杂乱啊。。。(VS2012 WIN8 64位测试通过)
喔喔
------解决思路----------------------
------解决思路----------------------
dir_inc为方向选择,看题目是4个方向,你的代码又说其它方向,在这个数组里面修改即可
原书第八章的编程题。
我是小白,花了两个小时写了出来,感觉很繁琐。
有木有更简便的方法呢?
百度找到的许多方法,感觉略微不全面。
****论坛的赵四老师的代码,看得我晕乎乎的。
然后题目我就不赘述了,有关题目的链接在这里:
http://bbs.chinaunix.net/thread-3769671-1-1.html
我写的代码,比较杂乱啊。。。(VS2012 WIN8 64位测试通过)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define NorthSquare AlphaSquare[--m][n]
#define EastSquare AlphaSquare[m][++n]
#define SouthSquare AlphaSquare[++m][n]
#define WestSquare AlphaSquare[m][--n]
#define TagOfTheNorth AlphaSquare[m-1][n]
#define TagOfTheEast AlphaSquare[m][n+1]
#define TagOfTheSouth AlphaSquare[m+1][n]
#define TagOfTheWest AlphaSquare[m][n-1]
int m=3,n=2;
int alphaNumber = 65;
int tempNum = 0;
int main(void)
{
char AlphaSquare[12][12] = {'\0'};
int i,j;
srand((unsigned) time(NULL));
for(i=0; i<12; i++)
{
for(j=0; j<12; j++)
{
if((i==0)||(j==0)||(i==11)||(j==11))
{
AlphaSquare[i][j]='*';
}
}
}
//printf("Please Input the Original Position (m, n): \n");
//scanf_s("%d,%d",&m,&n);
AlphaSquare[m][n] = alphaNumber;
while(alphaNumber<=89)
{
if(TagOfTheNorth=='\0'&&TagOfTheWest=='\0'&&TagOfTheSouth=='\0'&&TagOfTheEast=='\0')
{
tempNum = rand() % 4;
switch(tempNum)
{
case 0:
WestSquare = ++alphaNumber;
break;
case 1:
SouthSquare = ++alphaNumber;
break;
case 2:
EastSquare = ++alphaNumber;
break;
case 3:
NorthSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth!='\0'&&TagOfTheWest=='\0'&&TagOfTheSouth=='\0'&&TagOfTheEast=='\0') //网开三面
{
// srand((unsigned) time(NULL));
tempNum = rand() % 3;
switch(tempNum)
{
case 0:
WestSquare = ++alphaNumber;
break;
case 1:
SouthSquare = ++alphaNumber;
break;
case 2:
EastSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth=='\0'&&TagOfTheWest!='\0'&&TagOfTheSouth=='\0'&&TagOfTheEast=='\0')
{
// srand((unsigned) time(NULL));
tempNum = rand() % 3;
switch(tempNum)
{
case 0:
NorthSquare = ++alphaNumber;
break;
case 1:
SouthSquare = ++alphaNumber;
break;
case 2:
EastSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth=='\0'&&TagOfTheWest=='\0'&&TagOfTheSouth!='\0'&&TagOfTheEast=='\0')
{
// srand((unsigned) time(NULL));
tempNum = rand() % 3;
switch(tempNum)
{
case 0:
WestSquare = ++alphaNumber;
break;
case 1:
NorthSquare = ++alphaNumber;
break;
case 2:
EastSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth=='\0'&&TagOfTheWest=='\0'&&TagOfTheSouth=='\0'&&TagOfTheEast!='\0')
{
// srand((unsigned) time(NULL));
tempNum = rand() % 3;
switch(tempNum)
{
case 0:
WestSquare = ++alphaNumber;
break;
case 1:
SouthSquare = ++alphaNumber;
break;
case 2:
NorthSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth!='\0'&&TagOfTheWest!='\0'&&TagOfTheSouth=='\0'&&TagOfTheEast=='\0') //网开两面
{
// srand((unsigned) time(NULL));
tempNum = rand() % 2;
switch(tempNum)
{
case 0:
SouthSquare = ++alphaNumber;
break;
case 1:
EastSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth!='\0'&&TagOfTheWest=='\0'&&TagOfTheSouth!='\0'&&TagOfTheEast=='\0')
{
// srand((unsigned) time(NULL));
tempNum = rand() % 2;
switch(tempNum)
{
case 0:
WestSquare = ++alphaNumber;
break;
case 1:
EastSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth!='\0'&&TagOfTheWest=='\0'&&TagOfTheSouth=='\0'&&TagOfTheEast!='\0')
{
// srand((unsigned) time(NULL));
tempNum = rand() % 2;
switch(tempNum)
{
case 0:
WestSquare = ++alphaNumber;
break;
case 1:
SouthSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth=='\0'&&TagOfTheWest!='\0'&&TagOfTheSouth!='\0'&&TagOfTheEast=='\0')
{
// srand((unsigned) time(NULL));
tempNum = rand() % 2;
switch(tempNum)
{
case 0:
NorthSquare = ++alphaNumber;
break;
case 1:
EastSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth=='\0'&&TagOfTheWest!='\0'&&TagOfTheSouth=='\0'&&TagOfTheEast!='\0')
{
// srand((unsigned) time(NULL));
tempNum = rand() % 2;
switch(tempNum)
{
case 0:
NorthSquare = ++alphaNumber;
break;
case 1:
SouthSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth=='\0'&&TagOfTheWest=='\0'&&TagOfTheSouth!='\0'&&TagOfTheEast!='\0')
{
// srand((unsigned) time(NULL));
tempNum = rand() % 2;
switch(tempNum)
{
case 0:
NorthSquare = ++alphaNumber;
break;
case 1:
WestSquare = ++alphaNumber;
break;
}
}
else if(TagOfTheNorth!='\0'&&TagOfTheWest=='\0'&&TagOfTheSouth!='\0'&&TagOfTheEast!='\0') //网开一面
{
WestSquare = ++alphaNumber;
}
else if(TagOfTheNorth!='\0'&&TagOfTheWest!='\0'&&TagOfTheSouth=='\0'&&TagOfTheEast!='\0')
{
SouthSquare = ++alphaNumber;
}
else if(TagOfTheNorth!='\0'&&TagOfTheWest!='\0'&&TagOfTheSouth!='\0'&&TagOfTheEast=='\0')
{
EastSquare = ++alphaNumber;
}
else if(TagOfTheNorth=='\0'&&TagOfTheWest!='\0'&&TagOfTheSouth!='\0'&&TagOfTheEast!='\0')
{
NorthSquare = ++alphaNumber;
}
if(TagOfTheNorth!='\0'&&TagOfTheWest!='\0'&&TagOfTheSouth!='\0'&&TagOfTheEast!='\0') //全部堵住
{
for(i=1; i<11; i++)
{
for(j=1; j<11; j++)
{
if(AlphaSquare[i][j]=='\0')
{
AlphaSquare[i][j] = '.';
}
}
}
for(i=1; i<11; i++)
{
for(j=1; j<11; j++)
{
printf("%c ", AlphaSquare[i][j]);
}
printf("\n");
}
printf("\n");
printf("\n It's Stopped !! \n");
system("pause");
exit(0);
}
}
for(i=1; i<11; i++)
{
for(j=1; j<11; j++)
{
if(AlphaSquare[i][j]=='\0')
{
AlphaSquare[i][j] = '.';
}
}
}
for(i=0; i<12; i++)
{
for(j=0; j<12; j++)
{
printf("%c ", AlphaSquare[i][j]);
}
printf("\n");
}
printf("\n");
for(i=1; i<11; i++)
{
for(j=1; j<11; j++)
{
printf("%c ", AlphaSquare[i][j]);
}
printf("\n");
}
printf("\n");
system("pause");
return 0;
}
//已经解决:西南,纯北,纯西,纯南(2字符),纯东会出问题
喔喔
------解决思路----------------------
int test()
{
char a[10][10];
int ch='A';
int k;
int x,y;
int i,j;
memset( a, 0, sizeof(a) );
a[0][0] = 'A';
ch++;
srand( (unsigned)time( NULL ) );
for( i=0; i<25; i++,ch++ )
{
k = rand()%4;
for( j=0; j<4; j++, k = k+1>3 ? 0:k+1 )
{
switch(k)
{
case 0://上
if( y-1 < 0 ) continue;
if( a[x][y-1] != '\0' ) continue;
y--;
break;
case 1://右
if( x+1 >= 10 ) continue;
if( a[x+1][y] != '\0' ) continue;
x++;
break;
case 2://下
if( y+1 >= 10 ) continue;
if( a[x][y+1] != '\0' ) continue;
y++;
break;
case 3://左
if( x-1 < 0 ) continue;
if( a[x-1][y] != '\0' ) continue;
x--;
break;
default:
return;
}
a[x][y] = ch;
break;
}
if( j >= 4 ) return;
}
}
------解决思路----------------------
dir_inc为方向选择,看题目是4个方向,你的代码又说其它方向,在这个数组里面修改即可
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
const int max_grid=10;
char grid[max_grid][max_grid+1];
int dir_inc[][2]={{-1,0},{0,1},{1,0},{0,-1}};
const int alldir =sizeof(dir_inc)/sizeof(dir_inc[0]);
const char bkchar='*';
void go()
{
int x=0,y=0;
char ch='A';
grid[y][x] =ch;
int useidx[alldir][2];
for(++ch;ch<='Z';++ch)
{
int avail=0;
for(int i=0;i<alldir;i++) {
int ny =y+dir_inc[i][0],nx=x+dir_inc[i][1];
if(nx>=0&&nx<max_grid&&ny>=0&&ny<max_grid&&grid[ny][nx]==bkchar){
useidx[avail][0]=ny, useidx[avail++][1]=nx;
}
}
if(!avail) return;
int dir =rand() % avail;
y =useidx[dir][0],x =useidx[dir][1];
grid[y][x] =ch;
}
}
void show()
{
for(int i=0;i<max_grid;i++)
{
grid[i][max_grid]=0;
puts(grid[i]);
}
}
int main()
{
srand(time(NULL));
memset(grid,bkchar,sizeof grid);
go();
show();
return 0;
}