1.蛇形图问题
#include<iostream>
#include<string.h>
#define max 100
using namespace std;
int a[max][max];
int main()
{
int x,y,n,tot=0;
cin>>n;
memset(a,0,sizeof(a));
tot=a[x=0][y=n-1]=1;
while(tot<n*n)
{
while(x+1<n&&!a[x+1][y]) a[++x][y]=++tot;
while(y-1>=0&&!a[x][y-1]) a[x][--y]=++tot;
while(x-1>=0&&!a[x-1][y]) a[--x][y]=++tot;
while(y+1<n&&!a[x][y+1]) a[x][++y]=++tot;
}
for(x=0;x<n;x++)
{
for(y=0;y<n;y++)
printf("%3d",a[x][y]);
printf("\n");
}
return 0;
}
2.环状序列字典
//环状序列分析:在一个封闭的圆环内寻找到一个起点使其为最优化字典序列,设定字符数组为s[i],s[(p+i)%n]与s[(q+i)%n]比较
#include <stdio.h>
#include <string.h>
#define max 105
int less(const char*s,int p,int q)
{
int n=strlen(s);
for(int i=0;i<n;i++)
{
if(s[(p+i)%n]!=s[(q+i)%n]) return s[(p+i)%n]<s[(q+i)%n];
}
return 0;
}
int main()
{
int T,n;
char s[max];
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
int ans=0;
int n=strlen(s);
for(int i=1;i<n;i++)
if(less(s,i,ans)) ans=i;
for(i=0;i<n;i++)
putchar(s[(i+ans)%n]);
putchar('\n');
}
return 0;
}
3、约瑟夫环
/*#include<stdio.h>
int main()
{
int n,m,i,s=0;
printf("N M= ");
scanf("%d%d",&n,&m);
for(i=2;i<=n;i++)
{
s=(s+m)%i;
}
printf("The winner is%d\n",s+1);
return 0;
}
#include<stdio.h>
int main()
{
int y(int n,int m);
int a,b,c;
scanf("%d%d",&a,&b);
c=y(a,b);
printf("最后一个数为:%d\n",c);
}
int y(int n,int m)
{
int x;
if(n==1)
x=1;
else
{
x=(y(n-1,m)+m)%n;
if(x==0) x=n;
}
return x;
}*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
int y(int n,int m);
int p,q,r;
printf("请输入参选人的个数p和开始的位置q:\n");
scanf("%d%d",&p,&q);
r=y(p,q);
printf("最后那个人的初始位置是:%d\n",r);
}
int y(int n,int m)
{
int i,j=0,s=0,l;
int *a=(int *)malloc(sizeof(int));
int *b=(int *)malloc(sizeof(int));
for(i=0;i<n;i++)
{
a[i]=i+1;
}
a[n]=-1;
for(i=0;j!=n;i++)
{
if(a[i]==-1)
i=0;
if(a[i]!=0 && a[i]!=-1)
s++;
if(s==m)
{
b[j]=a[i];
a[i]=0;
j++;
s=0;
}
}
for(i=0;i<n;i++)
{
printf("%5d",b[i]);
}
printf("\n");
l=b[n-1];
return l;
}
4、八皇后问题
#include <stdio.h>
int ans[92][8], n, b, i, j, num, hang[8];
void queen(int i){
int j, k;
if(i == 8){ //一组新的解产生了
for(j = 0; j < 8; j++) ans[num][j] = hang[j] + 1;
num++;
return;
}
for (j=0; j<8; j++){ //将当前皇后i逐一尝试放置在不同的列
for(k=0; k<i; k++) //逐一判定i与前面的皇后是否冲突
if( hang[k] == j || (k - i) == (hang[k] - j) || (i - k) == (hang[k] - j )) break;
if (k == i) { //放置i,尝试第i+1个皇后
hang[i] = j;
queen(i + 1);
}
}
}
void main( ){
num=0;
queen(0);
scanf(“%d”, &n);
for(i = 0; i < n; i++){
scanf(“%d”, &b);
for(j = 0; j < 8; j++) printf(“%d”, ans[b - 1][j]);
printf(“\n”);
}
}