分手后还要不要做朋友:c语言题目

来源:百度文库 编辑:高校问答 时间:2024/04/29 05:56:08
(1)“八后”问题 8行8列方阵,将数字1-8放入,要求任意行,列,对角线
上,只能有一个数字,输出放好数字的全部方阵。
(2)字数统计 统计一篇文章里有多少汉字,多少英文字母,多少个数字,多少个其他字符。
编的好 加一百

(1)递归算法
#define QUEENS 8
int iCount = 0;
int Site[QUEENS];
void Queen(int n);
void Output();
int IsValid(int n);
/*----------------------------Main:主函数。--------------------*/
void main()
{
Queen(0);

getch();
}

/*-----------Queen:递归放置第n个皇后,程序的核心!-------------*/
void Queen(int n)
{
int i;

if(n == QUEENS)
{
Output();
return;
}

for(i = 1 ; i <= QUEENS ; i++)
{
Site[n] = i;

if(IsValid(n))
Queen(n+1);
}
}

/*--IsValid:判断第n个皇后放上去之后,是否合法,即是否无冲突。---*/
int IsValid(int n)
{
int i;

for(i = 0 ; i < n ; i++)
{
if(Site[i] == Site[n])
return 0;

if(abs(Site[i] - Site[n]) == (n - i))
return 0;
}

return 1;
}

/*------Output:输出一个解,即一种没有冲突的放置方案。---------*/
void Output()
{
int i;

printf( "No.%-5d " , iCount);

for(i = 0 ; i < QUEENS ; i++ )
printf( "%d " , Site[i]);

printf( "\n ");
}

/*---------非递归算法----------------*/
#include <stdio.h>

#define NCOUNT 8
int nArray[NCOUNT][NCOUNT];

// 判断一个点是否是安全点
bool IsSafe(int i,int j)
{
int x=i,y=j;
while(1)
{
x -= 1;
if( x<0 )break;
y -= 1;
if( y<0)break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x += 1;
if( x>NCOUNT-1 )break;
y += 1;
if( y >NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
y-=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x -=1;
if( x<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
x +=1;
if( x>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y -=1;
if( y<0 )break;
if( nArray[x][y] == 1)return false;
}
x=i;
y=j;
while(1)
{
y +=1;
if( y>NCOUNT-1 )break;
if( nArray[x][y] == 1)return false;
}
return true;
}

void main()
{
int nVe=-1,nHo=0;
bool bRetry = false;
int nSol = 0;

// 清除棋盘
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
nArray[i][j] = 0;
}

while(1)
{
nVe += 1;
if( nVe>NCOUNT-1)
{// 棋盘放满,打印当前棋盘上棋子位置
nSol++;
printf("Sol %d: ",nSol);
for(int i=0;i<NCOUNT;i++)
{
for( int j=0;j<NCOUNT;j++)
if( nArray[i][j]==1)
printf("(%d,%d) ",i,j);
}
printf("\r\n");
// 回溯查找下一个可行方案
nVe -= 2;
bRetry = true;
continue;
}

int nFill = 0;
if( bRetry )
{ // 回溯计算
bRetry = false;
for( i=0;i<NCOUNT;i++)
{// 得到棋子的位置
if( nArray[nVe][i] == 1)
{
nArray[nVe][i] = 0;
nFill = i;
break;
}
}
if( nFill == NCOUNT-1)
{// 棋子在当前行已经是最后的位置
// 如果是第一行,算法结束
if( nVe == 0)
{
getchar();
return;
}
// 否则回溯
nVe -= 2;
bRetry = true;
continue;

}
// 从当前位置之后查找一个安全点
nFill += 1;
}

bool bFilled = false;
for( i=nFill;i<NCOUNT;i++)
{// 当前行查找一个安全点
if( IsSafe(nVe,i))
{
bFilled = true;
nArray[nVe][i] = 1;
break;
}
}
// 找不到安全点,回溯
if( !bFilled )
{
nVe -= 2;
bRetry = true;
}
}

}

(2)
#include <stdio.h>
main()
{
int h,z,s,o;
FILE *fp;
char ch,filename[20];
printf("输入要统计的文章名称:\n");
scanf("%s",filename);
if((fp=open(filename,"r"))==NULL)
{
printf("cannot open the file\n");
exit(0);
}
ch=fgetc(fp);
h=0;z=0;s=0;o=0;
while(ch!=EOF)
{
if(ch>'0x7f')
h++;
else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='z'))
z++;
else if(ch>='0'&&ch<='9')
s++;
else
o++;
ch=fgetc(fp);
}
fclose(fp);
h=h/2;
printf("这篇文章里有 %d 个汉字,%d 个英文字母,%d 个数字和%d 个其他字符\n",h,z,s,o);

}

(1)穷举法,最后可得出92种可能,其实只有12种可能。

#include <stdio.h>

int conA[17]={0},
conB[15]={0},
conC[9]={0},
conD[9]={0};
int row[9]={0},CountNum=0;

main()
{ void unmark(int i,int j);
void mark(int i,int j);
void PRN();
void tryOne(int n);
int i;

for(i=2;i<=16;i++) conA[i]=0;
for(i=0;i<=14;i++) conB[i]=0;
for(i=1;i<=8;i++) conC[i]=0;
for(i=1;i<=8;i++) conD[i]=0;
tryOne(1);
getchar();
}

void unmark(int i,int j)
{conA[i+j]=0;
conB[i-j+7]=0;
conC[i]=0;
conD[j]=0;
}
void mark(int i,int j)
{row[i]=j;
conA[i+j]=1;
conB[i-j+7]=1;
conC[i]=1;
conD[j]=1;
}
int CanPass(int i,int j)
{if (!conA[i+j]&&!conB[i-j+7]&&!conC[i]&&!conD[j])
return 1;
else
return 0;
}
void PRN()
{int i;
++CountNum;
printf("\n");
for(i=1;i<=8;i++)
printf("R[%d]=%d ",i,row[i]);
printf("Count:=%d\n",CountNum);
}
void tryOne(int n)
{int i;
if (n>=9||n<=0) return;
for(i=1;i<=8;i++)
{ if (CanPass(n,i))
{
mark(n,i);
if (n==8) PRN();
tryOne(n+1);
unmark(n,i);
}
}
}

5 3 1 6 8 2 4 7
5 3 1 7 2 8 6 4
5 3 8 4 7 1 6 2
5 7 1 3 8 6 4 2
5 7 1 4 2 8 6 3
5 7 2 4 8 1 3 6
5 7 2 6 3 1 4 8
5 7 2 6 3 1 8 4
5 7 4 1 3 8 6 2
5 8 4 1 3 6 2 7
5 8 4 1 7 2 6 3
6 1 5 2 8 3 7 4
6 2 7 1 3 5 8 4
6 2 7 1 4 8 5 3
6 3 1 7 5 8 2 4
6 3 1 8 4 2 7 5
6 3 1 8 5 2 4 7
6 3 5 7 1 4 2 8
6 3 5 8 1 4 2 7
6 3 7 2 4 8 1 5
6 3 7 2 8 5 1 4
6 3 7 4 1 8 2 5
6 4 1 5 8 2 7 3
6 4 2 8 5 7 1 3
6 4 7 1 3 5 2 8
6 4 7 1 8 2 5 3
6 8 2 4 1 7 5 3
7 1 3 8 6 4 2 5
7 2 4 1 8 5 3 6
7 2 6 3 1 4 8 5
7 3 1 6 8 5 2 4
7 3 8 2 5 1 6 4
7 4 2 5 8 1 3 6
7 4 2 8 6 1 3 5
7 5 3 1 6 8 2 4
8 2 4 1 7 5 3 6
8 2 5 3 1 7 4 6
8 3 1 6 2 5 7 4
8 4 1 3 6 2 7 5

(2)读进内存直接用if判断即可。

说下第二个问题的思路,编就免了,没时间
可以将文章从头读到尾,判断它的ASCII码,如果ASCII码不在0到128之间,则说明是中文(如果含有其他国家的文字则也可能会不在0到128之间),由此就可将累计加一,最后再将其除二则可以得出中文字符数,判断英文字母、数字和其他字符可以参照ASCII码值进行判断,具体请参阅ASCII码表

第一个八后问题可以对照这个网址

http://www.quickviews.net/data/2006/0126/article_10667.htm