33,008
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
/**只用修改这里*****************/
#define SIZE 5
int list[SIZE][SIZE]={
0, 17, 13, 24, 10,
10, 0, 20, 9, 6,
17, 29, 0, 21, 28,
12, 10, 22, 0, 19,
12, 18, 31, 20, 0
};
/*****************只用修改这里**/
void travel(int *a,int len){
int *ta,*tb;
int *p,*path;
int flg;
int i,j,k,t;
int x,y,z;
ta=(int*)malloc(sizeof(int)*(len-1)*len);
tb=(int*)malloc(sizeof(int)*(len-1)*len);
path=(int*)malloc(sizeof(int)*(len-1));
memset(ta,0,sizeof(int)*(len-1)*len);
memset(tb,0,sizeof(int)*(len-1)*len);
memset(path,0,sizeof(int)*(len-1));
for(k=1;k<len;k++){
*(ta+len*(k-1))=*(a+k*len);
*(ta+len*(k-1)+k)=1;
}
flg=1;
for(z=2;z<len;z++){
for(i=1;i<len;i++){
y=-1;
for(k=1;k<len;k++){
if(flg==1){
if(*(ta+len*(k-1))==-1) continue;
if(*(ta+len*(k-1)+i)!=0) continue;
x=*(a+len*i+k)+*(ta+len*(k-1));
}else{
if(*(tb+len*(k-1))==-1) continue;
if(*(tb+len*(k-1)+i)!=0) continue;
x=*(a+i*len+k)+*(tb+len*(k-1));
}
if(y==-1||x<y){
j=k;y=x;
}
}
if(y==-1){
if(flg==1) *(tb+len*(i-1))=y;
else *(ta+len*(i-1))=y;
continue;
}
if(flg==1){
*(tb+len*(i-1))=y;
for(k=1;k<len;k++){
if(*(ta+len*(j-1)+k)==0) *(tb+len*(i-1)+k)=0;
else *(tb+len*(i-1)+k)=*(ta+len*(j-1)+k)+1;
}
*(tb+len*(i-1)+i)=1;
}else{
*(ta+len*(i-1))=y;
for(k=1;k<len;k++){
if(*(tb+len*(j-1)+k)==0) *(ta+len*(i-1)+k)=0;
else *(ta+len*(i-1)+k)=*(tb+len*(j-1)+k)+1;
}
*(ta+len*(i-1)+i)=1;
}
}
if(flg==1) flg=0;
else flg=1;
}
y=-1;
for(i=1;i<len;i++){
if(flg==1){
if(*(ta+len*(i-1))==-1) continue;
x=*(ta+len*(i-1))+*(a+i);
}else{
if(*(tb+len*(i-1))==-1) continue;
x=*(tb+len*(i-1))+*(a+i);
}
if(y==-1||x<y){
y=x;t=i;
}
}
/**打印结果************************/
if(flg==1) p=ta+len*(t-1);
else p=tb+len*(t-1);
for(i=1;i<len;i++){
path[p[i]-1]=i;
}
printf("path: 0 ");
for(i=0;i<len-1;i++) printf("-> %d ",path[i]);
printf("-> 0\n");
printf("cost: %d\n",y);
/************************打印结果**/
free(ta);free(tb);free(path);
}
class CTimer
{
public:
__forceinline CTimer( void ) {
QueryPerformanceFrequency( (PLARGE_INTEGER)&m_nFreq );
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nStart ); }
__forceinline void Reset( void ) {
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nStart ); }
__forceinline double Stop( void ) {
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nCur );
return double( m_nCur - m_nStart ) / double( m_nFreq ); }
__forceinline bool SelfTest( void ){
return ( 0 != QueryPerformanceFrequency( (PLARGE_INTEGER)&m_nFreq ) ); }
private:
__int64 m_nCur;
__int64 m_nFreq;
__int64 m_nStart;
};
int main(){
CTimer tmr;
travel(&list[0][0],SIZE);
printf("use time: %f s\n",tmr.Stop());
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**只用修改这里*****************/
#define SIZE 8
int list[SIZE][SIZE]={
0, 17, 13, 24, 10, 12, 34, 45,
10, 0, 20, 9, 6, 34, 13, 39,
17, 29, 0, 21, 28, 24, 27, 19,
12, 10, 22, 0, 19, 21, 22, 23,
12, 18, 31, 20, 0, 24, 25, 26,
45, 43, 41, 39, 36, 0, 31, 25,
14, 15, 16, 17, 18, 19, 0, 25,
51, 52, 53, 54, 55, 25, 23, 0
};
/*****************只用修改这里**/
void travel(int *a,int len){
int *p,*c,*tmp;
int i,j,k,flg;
int b=-1,d;
if(len<1){
printf("error: len<1\n");return;
}
p=(int*)malloc(sizeof(int)*len);
c=(int*)malloc(sizeof(int)*len);
tmp=(int*)malloc(sizeof(int)*len);
memset(p,0,sizeof(int)*len);
memset(c,0,sizeof(int)*len);
k=0;flg=1;
while(flg){
for(p[k]=0;p[k]<len;p[k]++){
for(i=0;i<k;i++){
if(p[i]==p[k]) break;
}
if(i!=k) continue;
c[k]++;
if(k==len-1){
///////////////////////////////////////
d=0;
for(i=0;i<len-1;i++) d+=*(a+p[i]*len+p[i+1]);
if(b==-1||d<b){
b=d;
memcpy(tmp,p,sizeof(int)*len);
}
///////////////////////////////////////
for(i=len-1,j=1;c[i]==j&&i>=0;i--,j++);
if(j==len+1){
flg=0;break;
}
k=i;
if(k<len-1){
memset(c+k+1,0,sizeof(int)*(len-k-1));
}
}
else k++;
}
}
printf("path: ");
for(i=0;i<len-1;i++) printf("%d -> ",tmp[i]);
printf("%d\n",tmp[i]);
printf("cost: %d\n",b);
free(p);free(c);free(tmp);
}
int main(){
travel(&list[0][0],SIZE);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**只用修改这里*****************/
#define SIZE 5
int list[SIZE][SIZE]={
0, 17, 13, 24, 10,
10, 0, 20, 9, 6,
17, 29, 0, 21, 28,
12, 10, 22, 0, 19,
12, 18, 31, 20, 0};
/*****************只用修改这里**/
void travel(int *a,int len){
int *p,*c,*tmp;
int i,j,k,flg;
int b=-1,d;
if(len<1){
printf("error: len<1\n");return;
}
p=(int*)malloc(sizeof(int)*len);
c=(int*)malloc(sizeof(int)*len);
tmp=(int*)malloc(sizeof(int)*len);
memset(p,0,sizeof(int)*len);
memset(c,0,sizeof(int)*len);
k=0;flg=1;
while(flg){
for(p[k]=0;p[k]<len;p[k]++){
for(i=0;i<k;i++){
if(p[i]==p[k]) break;
}
if(i!=k) continue;
c[k]++;
if(k==len-1){
///////////////////////////////////////
d=*(a+p[0]*len+p[1])+*(a+p[1]*len+p[2])+*(a+p[2]*len+p[3])+*(a+p[3]*len+p[4]);
if(b==-1||d<b){
b=d;
memcpy(tmp,p,sizeof(int)*len);
}
///////////////////////////////////////
for(i=len-1,j=1;c[i]==j&&i>=0;i--,j++);
if(j==len+1){
flg=0;break;
}
k=i;
if(k<len-1){
memset(c+k+1,0,sizeof(int)*(len-k-1));
}
}
else k++;
}
}
printf("path: %d -> %d -> %d -> %d -> %d\n",tmp[0],tmp[1],tmp[2],tmp[3],tmp[4]);
printf("cost: %d\n",b);
free(p);free(c);free(tmp);
}
int main(){
travel(&list[0][0],SIZE);
return 0;
}
#include <stdio.h>
int list[5][5]={
0, 17, 13, 24, 10,
10, 0, 20, 9, 6,
17, 29, 0, 21, 28,
12, 10, 22, 0, 19,
12, 18, 31, 20, 0};
void travel(int start,int end){
int p[5]={0};
int tmp[5]={0};
int a,b=-1;
p[0]=start;
if(start==end){
for(p[1]=0;p[1]<5;p[1]++){
if(p[0]==p[1]) continue;
for(p[2]=0;p[2]<5;p[2]++){
if(p[0]==p[2]||p[1]==p[2]) continue;
for(p[3]=0;p[3]<5;p[3]++){
if(p[0]==p[3]||p[1]==p[3]||p[2]==p[3]) continue;
for(p[4]=0;p[4]<5;p[4]++){
if(p[0]==p[4]||p[1]==p[4]||p[2]==p[4]||p[3]==p[4]) continue;
a=list[p[0]][p[1]]+list[p[1]][p[2]]+list[p[2]][p[3]]+list[p[3]][p[4]]+list[p[4]][p[0]];
if(b==-1||a<b){
b=a;tmp[0]=p[0];tmp[1]=p[1];tmp[2]=p[2];tmp[3]=p[3];tmp[4]=p[4];
}
}
}
}
}
printf("path: %d -> %d -> %d -> %d -> %d -> %d\t",tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],tmp[0]);
printf("cost: %d\n",b);
}else{
p[4]=end;
for(p[1]=0;p[1]<5;p[1]++){
if(p[0]==p[1]||p[4]==p[1]) continue;
for(p[2]=0;p[2]<5;p[2]++){
if(p[0]==p[2]||p[1]==p[2]||p[4]==p[2]) continue;
for(p[3]=0;p[3]<5;p[3]++){
if(p[0]==p[3]||p[1]==p[3]||p[2]==p[3]||p[4]==p[3]) continue;
a=list[p[0]][p[1]]+list[p[1]][p[2]]+list[p[2]][p[3]]+list[p[3]][p[4]];
if(b==-1||a<b){
b=a;tmp[0]=p[0];tmp[1]=p[1];tmp[2]=p[2];tmp[3]=p[3];tmp[4]=p[4];
}
}
}
}
printf("path: %d -> %d -> %d -> %d -> %d\t\t",tmp[0],tmp[1],tmp[2],tmp[3],tmp[4]);
printf("cost: %d\n",b);
}
}
int main(){
int i,j;
for(i=0;i<5;i++) for(j=0;j<5;j++) travel(i,j);
return 0;
}
#include <stdio.h>
int list[5][5]={
0, 17, 13, 24, 10,
10, 0, 20, 9, 6,
17, 29, 0, 21, 28,
12, 10, 22, 0, 19,
12, 18, 31, 20, 0};
void start(int s){
int p[5]={0};
int tmp[5]={0};
int i=0,a,b=-1;
p[0]=s;
for(p[1]=0;p[1]<5;p[1]++){
if(p[0]==p[1]) continue;
for(p[2]=0;p[2]<5;p[2]++){
if(p[0]==p[2]||p[1]==p[2]) continue;
for(p[3]=0;p[3]<5;p[3]++){
if(p[0]==p[3]||p[1]==p[3]||p[2]==p[3]) continue;
for(p[4]=0;p[4]<5;p[4]++){
if(p[0]==p[4]||p[1]==p[4]||p[2]==p[4]||p[3]==p[4]) continue;\
a=list[p[0]][p[1]]+list[p[1]][p[2]]+list[p[2]][p[3]]+list[p[3]][p[4]];
if(b==-1||a<b){
b=a;
tmp[0]=p[0];tmp[1]=p[1];tmp[2]=p[2];tmp[3]=p[3];tmp[4]=p[4];
}
}
}
}
}
printf("path: %d -> %d -> %d -> %d -> %d\n",tmp[0],tmp[1],tmp[2],tmp[3],tmp[4]);
printf("cost: %d\n",b);
}
int main(){
int i;
for(i=0;i<5;i++) start(i);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int list[5][5]={
0, 17, 13, 24, 10,
10, 0, 20, 9, 6,
17, 29, 0, 21, 28,
12, 10, 22, 0, 19,
12, 18, 31, 20, 0};
int main(){
int p[5]={0};
int tmp[5]={0};
int i=0,a,b=-1;
for(p[0]=0;p[0]<5;p[0]++){
for(p[1]=0;p[1]<5;p[1]++){
if(p[0]==p[1]) continue;
for(p[2]=0;p[2]<5;p[2]++){
if(p[0]==p[2]||p[1]==p[2]) continue;
for(p[3]=0;p[3]<5;p[3]++){
if(p[0]==p[3]||p[1]==p[3]||p[2]==p[3]) continue;
for(p[4]=0;p[4]<5;p[4]++){
if(p[0]==p[4]||p[1]==p[4]||p[2]==p[4]||p[3]==p[4]) continue;\
a=list[p[0]][p[1]]+list[p[1]][p[2]]+list[p[2]][p[3]]+list[p[3]][p[4]];
if(b==-1||a<b){
b=a;
tmp[0]=p[0];tmp[1]=p[1];tmp[2]=p[2];tmp[3]=p[3];tmp[4]=p[4];
}
}
}
}
}
}
printf("path: %d -> %d -> %d -> %d -> %d\n",tmp[0],tmp[1],tmp[2],tmp[3],tmp[4]);
printf("cost: %d\n",b);
return 0;
}