请问个很菜的有关问题,C语言写横竖斜相加都等于15的程序

请教个很菜的问题,C语言写横竖斜相加都等于15的程序
大家好,请教个很菜的问题,C语言写横竖斜相加都等于15的程序,就是如下:
  4 9 2
  3 5 7
  8 1 6
我是定义一个二维数组a[3][3],然后一个一个去计算统计横竖斜是否为15,都符合就printf,不符合就互换值,然后重新去统计,一切我都考虑清楚了,就是不知道怎么互换值,不是仅仅一个
int temp;
temp=a;
a=b;
b=temp;
就解决了,而且怎么记得住不会走重复的路呢?  
纠结中,求解,谢谢。

给个大概的提示就行,如果有互换和防止走重复的路的片段代码也行,谢谢。
不要长篇大论。
c 语言

------解决方案--------------------
找个全排列的算法就好了,按顺序遍历,符合条件就输出
------解决方案--------------------
http://mengliao.blog.51cto.com/876134/824079,自己选一个把,这种代码很多。。。或者你自己搜全排列
------解决方案--------------------
其实三维数组你也可以当做一位数组来看咯
  把条件分析处理好例如:
a1 a2 a3
a4 a5 a6
a7 a8 a9

然后通过吧a1-a9全排列的算法 在最里面判断:
a1+a5+a9 == a2+a3+a7 ==a2+a5+a9 == a4+a5+a6 == 15满足就打印出来呗
------解决方案--------------------
全排列供参考
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
    int s[256];
    int i;
    memset(s,0,sizeof(s));
    memset(count,0,sizeof(count));
    m=strlen(str);
    while(*str) {
        s[*str]++;
        str++;
    }
    n=0;
    for (i=0;i<256;i++)
        if (s[i]) {
            map[n]=i;
            count[n]=s[i];
            n++;
        }
}
void Find(int depth) {//递归式回溯法生成全排列
    if (depth==m) {
        int i;
        for (i=0;i<depth;i++) putchar(map[stack[i]]);
        putchar('\n');
    } else {
        int i;
        for (i=0;i<n;i++)
            if (count[i]) {
                stack[depth]=i;
                count[i]--;
                Find(depth+1);
                count[i]++;
            }
    }
}
void main(int argc,char**argv) {
    if (argc<2) {
        printf("%s 要产生全排列的字符串\n",argv[0]);